используйте mysql SUM () в предложении WHERE - PullRequest
44 голосов
/ 19 июля 2010

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

id | cash 
1    200
2    301
3    101
4    700

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

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

Как мне это сделать с помощью оператора mysql?

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

Ответы [ 4 ]

88 голосов
/ 19 июля 2010

Вы можете использовать агрегаты для сравнения только в предложении 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.

5 голосов
/ 19 июля 2010

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

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, а затемпропустить один и вернуть следующий.

3 голосов
/ 19 июля 2010

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

Вы можете использовать производную таблицу для объединения каждой строкив группу строк с меньшим значением 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 |
+----+----------+
0 голосов
/ 19 июля 2010

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

SELECT *
FROM tblMoney
HAVING Sum(CASH) > 500
...