example mysql aggregate-functions having-clause

example - use mysql SUM() en una cláusula WHERE



sum mysql example (4)

supongamos que tengo esta mesa

id | cash 1 200 2 301 3 101 4 700

y quiero devolver la primera fila en la que la suma de todo el efectivo anterior es mayor que un cierto valor:

Entonces, por ejemplo, si quiero devolver la primera fila en la que la suma de todo el efectivo anterior es mayor que 500, debe volver a la fila 3

¿Cómo hago esto usando la instrucción mysql?

utilizando WHERE SUM(cash) > 500 no funciona


Al usar funciones de agregado para filtrar, debe usar una instrucción HAVING.

SELECT * FROM tblMoney HAVING Sum(CASH) > 500


En general, una condición en la cláusula WHERE de una consulta SQL puede hacer referencia solo a una fila. El contexto de una cláusula WHERE se evalúa antes de que cualquier orden haya sido definida por una cláusula ORDER BY , y no hay un orden implícito en una tabla RDBMS.

Puede usar una tabla derivada para unir cada fila al grupo de filas con un valor de id menor, y producir la suma de cada grupo de suma. Luego prueba donde la suma cumple tu criterio.

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;

Salida:

+----+----------+ | id | cash_sum | +----+----------+ | 3 | 501 | +----+----------+


No probado, pero creo que esto estará cerca?

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

La idea es SUMAR todas las filas anteriores, obtener solo aquellas en las que la suma de las filas anteriores es> 500, luego omitir una y devolver la siguiente.


Solo puedes usar agregados para comparar en la cláusula HAVING:

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

La cláusula HAVING requiere que defina una cláusula GROUP BY.

Para obtener la primera fila donde la suma de todo el efectivo anterior es mayor que un cierto valor, use:

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

Como la función de agregado se produce en una subconsulta, se puede hacer referencia al alias de columna en la cláusula WHERE.