valores una todos sumas sumar suma los hacer como columna acumuladas acumulada mysql sql running-total

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 comando SET 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 ;