используйте СУММУ mysql () в операторе Where

предположите, что у меня есть эта таблица

id | cash 
1    200
2    301
3    101
4    700

и я хочу возвратить первую строку, в которой сумма всех предыдущих наличных денег больше, чем определенное значение:

Так, например, если я хочу возвратить первую строку, в которой сумма всех предыдущих наличных денег больше, чем 500, должен возвратиться для расположения в ряд 3

Как я делаю это использование mysql оператор?

использование WHERE SUM(cash) > 500 не работает

45
задан Dolph 19 July 2010 в 19:43
поделиться

4 ответа

Вы можете использовать только агрегаты для сравнения в предложении HAVING:

GROUP BY ...
  HAVING SUM(cash) > 500

Предложение HAVING требует, чтобы вы определяли предложение GROUP BY.

Чтобы получить первую строку, в которой сумма всех предыдущих денежных средств больше определенного значения, используйте:

SELECT y.id, y.cash
  FROM (SELECT t.id,
               t.cash,
               (SELECT SUM(x.cash)
                  FROM TABLE x
                 WHERE x.id <= t.id) AS running_total
         FROM TABLE t
     ORDER BY t.id) y
 WHERE y.running_total > 500
ORDER BY y.id
   LIMIT 1

Поскольку агрегатная функция встречается в подзапросе, псевдоним столбца для нее может быть указан в предложении WHERE.

91
ответ дан 26 November 2019 в 21:07
поделиться

Не тестировалось, но я думаю, что это будет близко?

SELECT m1.id
FROM mytable m1
INNER JOIN mytable m2 ON m1.id < m2.id
GROUP BY m1.id
HAVING SUM(m1.cash) > 500
ORDER BY m1.id
LIMIT 1,2

Идея состоит в том, чтобы просуммировать все предыдущие строки, получить только те, в которых сумма предыдущих строк> 500, затем пропустите одно и верните следующее.

5
ответ дан 26 November 2019 в 21:07
поделиться

Как правило, условие в предложении WHERE запроса SQL может ссылаться только на одну строку. Контекст предложения WHERE оценивается до того, как какой-либо порядок был определен предложением ORDER BY , и неявный порядок в таблице СУБД отсутствует.

Вы можете использовать производную таблицу для присоединения каждой строки к группе строк с меньшим значением id и получения суммы каждой группы сумм. Затем проверьте, соответствует ли сумма вашему критерию.

CREATE TABLE MyTable ( id INT PRIMARY KEY, cash INT );

INSERT INTO MyTable (id, cash) VALUES
  (1, 200), (2, 301), (3, 101), (4, 700);

SELECT s.*
FROM (
  SELECT t.id, SUM(prev.cash) AS cash_sum
  FROM MyTable t JOIN MyTable prev ON (t.id > prev.id)
  GROUP BY t.id) AS s
WHERE s.cash_sum >= 500
ORDER BY s.id
LIMIT 1;

Вывод:

+----+----------+
| id | cash_sum |
+----+----------+
|  3 |      501 |
+----+----------+
4
ответ дан 26 November 2019 в 21:07
поделиться

При использовании агрегатных функций для фильтрации необходимо использовать оператор HAVING.

SELECT *
FROM tblMoney
HAVING Sum(CASH) > 500
0
ответ дан 26 November 2019 в 21:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: