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.