mysql - sumas - sumar todos los valores de una columna php
Crear una columna de suma acumulativa en MySQL (6)
Usando una consulta correlacionada:
SELECT t.id,
t.count,
(SELECT SUM(x.count)
FROM TABLE x
WHERE x.id <= t.id) AS cumulative_sum
FROM TABLE t
ORDER BY t.id
Usando las variables de MySQL:
SELECT t.id,
t.count,
@running_total := @running_total + t.count AS cumulative_sum
FROM TABLE t
JOIN (SELECT @running_total := 0) r
ORDER BY t.id
Nota:
- El
JOIN (SELECT @running_total := 0) r
es una combinación cruzada, y permite la declaración de variables sin requerir un comandoSET
separado. - El alias de tabla,
r
, es requerido por MySQL para cualquier subconsulta / tabla derivada / vista en línea
Advertencias:
- MySQL específico; no portátil a otras bases de datos
- La
ORDER BY
es importante; garantiza que el orden coincida con el OP y puede tener mayores implicaciones para el uso de variables más complicadas (IE: psuedo ROW_NUMBER / RANK funcionalidad, que MySQL carece)
Tengo una mesa que se ve así:
id count
1 100
2 50
3 10
Quiero agregar una nueva columna llamada cumulative_sum, para que la tabla se vea así:
id count cumulative_sum
1 100 100
2 50 150
3 10 160
¿Hay una declaración de actualización de MySQL que pueda hacer esto fácilmente? ¿Cuál es la mejor manera de lograr esto?
Consulta de muestra
SET @runtot:=0;
SELECT
q1.d,
q1.c,
(@runtot := @runtot + q1.c) AS rt
FROM
(SELECT
DAYOFYEAR(date) AS d,
COUNT(*) AS c
FROM orders
WHERE hasPaid > 0
GROUP BY d
ORDER BY d) AS q1
Si el rendimiento es un problema, puede usar una variable de MySQL:
set @csum := 0;
update YourTable
set cumulative_sum = (@csum := @csum + count)
order by id;
Alternativamente, puede eliminar la columna cumulative_sum
y calcularla en cada consulta:
set @csum := 0;
select id, count, (@csum := @csum + count) as cumulative_sum
from YourTable
order by id;
Esto calcula la suma corriente en una forma de ejecución :)
También podría crear un disparador que calculará la suma antes de cada inserción
delimiter |
CREATE TRIGGER calCumluativeSum BEFORE INSERT ON someTable
FOR EACH ROW BEGIN
SET cumulative_sum = (
SELECT SUM(x.count)
FROM someTable x
WHERE x.id <= NEW.id
)
set NEW.cumulative_sum = cumulative_sum;
END;
|
No he probado esto
UPDATE t
SET cumulative_sum = (
SELECT SUM(x.count)
FROM t x
WHERE x.id <= t.id
)
select Id, Count, @total := @total + Count as cumulative_sum
from YourTable, (Select @total := 0) as total ;