87 votes

Créer une colonne de somme cumulée dans MySQL

J'ai un tableau qui ressemble à ceci :

id   count
1    100
2    50
3    10

Je veux ajouter une nouvelle colonne appelée cumulative_sum, de sorte que le tableau ressemblerait à ceci :

id   count  cumulative_sum
1    100    100
2    50     150
3    10     160

Existe-t-il une instruction de mise à jour MySQL permettant de faire cela facilement ? Quelle est la meilleure façon d'y parvenir ?

2voto

Greg Points 1041

Vous pouvez également créer un déclencheur qui calculera la somme avant chaque insertion.

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

Je ne l'ai pas testé

2voto

Jazz Points 26

Exemple de requête

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

1voto

Pavan Bashetty Points 11

Select id,count,sum(count)over(order by count desc) as cumulative_sum from tableName ;

J'ai utilisé la fonction d'agrégation sum sur la colonne count, puis j'ai utilisé la clause over. Cela résume chacune des lignes individuellement. La première ligne sera simplement 100. La deuxième ligne sera 100+50. La troisième ligne est 100+50+10 et ainsi de suite. En gros, chaque ligne est la somme de la ligne et de toutes les lignes précédentes, et la toute dernière est la somme de toutes les lignes. Donc la façon de voir les choses est que chaque ligne est la somme de la quantité où l'ID est inférieur ou égal à lui-même.

2 votes

Bien que cela puisse résoudre le problème, il est préférable de l'expliquer un peu pour que cela profite aux autres :)

0 votes

Ce n'est pas une sous-requête co-liée ou une sous-requête d'ailleurs... la sous-requête co-liée suit SELECT ...., (SELECT .... FROM table2 WHERE table2.id = table1.id ) FROM table1 ce que vous avez, c'est une query de fenêtre

0voto

Flavio_cava Points 1
  select t1.id, t1.count, SUM(t2.count) cumulative_sum
    from table t1 
        join table t2 on t1.id >= t2.id
    group by t1.id, t1.count

Pas à pas :

1- Etant donné le tableau suivant :

select *
from table t1 
order by t1.id;

id  | count
 1  |  11
 2  |  12   
 3  |  13

2 - Obtenir des informations par groupes

select *
from table t1 
    join table t2 on t1.id >= t2.id
order by t1.id, t2.id;

id  | count | id | count
 1  | 11    | 1  |  11

 2  | 12    | 1  |  11
 2  | 12    | 2  |  12

 3  | 13    | 1  |  11
 3  | 13    | 2  |  12
 3  | 13    | 3  |  13

3- Étape 3 : Somme de tous les comptes par groupe t1.id

select t1.id, t1.count, SUM(t2.count) cumulative_sum
from table t1 
    join table t2 on t1.id >= t2.id
group by t1.id, t1.count;

id  | count | cumulative_sum
 1  |  11   |    11
 2  |  12   |    23
 3  |  13   |    36

0 votes

Ajout d'une étape par étape pour comprendre la requête finale.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X