2
votes

comment additionner la valeur ligne à ligne dans mysql?

disons que j'ai des données dans mysql comme ceci:

select tabelA.date, sum(value)
from tabelA
inner join (select date from tabelA group by date) b on tabelA.date > b.date
group by tabelA.date

je veux le résultat comme ceci:

date | value
2010 | 1
2011 | 5
2012 | 7
2013 | 10

Je pensais que ce serait soit simple. J'essaye ceci:

date | value
2010 | 1
2011 | 4
2012 | 2
2013 | 3

J'ai l'impression de manquer quelque chose d'évident. Cela semble être une chose simple à faire.

Des idées?


2 commentaires

Quelle est votre version mysql?


mysql Ver 15.1 Distrib 5.5.35-MariaDB


3 Réponses :


0
votes
SELECT
    b.date,( SELECT sum( a.`value` ) FROM aa a WHERE a.date <= b.date ) value
FROM
    aa b 
GROUP BY
    b.date

0 commentaires

0
votes

Vous pouvez utiliser une variable:

SET @cumulative := 0;
SELECT date, (@cumulative := @cumulative+value) as value FROM tabelA

Cela gardera juste une trace de la somme actuelle. Il s'agit essentiellement d'une adaptation mineure de cette réponse pour obtenir un numéro de ligne.


0 commentaires

1
votes

La meilleure approche dans MySQL 8+ est les fonctions de fenêtre:

select date, (@csum := @csum + value) as running_sum
from (select a.date, a.value as value
      from tableA a
      order by a.date
     ) a cross join
     (select @csum := 0) params;

Dans les anciennes versions, les variables sont probablement la meilleure approche, mais elles doivent être utilisées avec précaution:

select a.date,
       sum(a.value) over (order by a.date)
from tabelA a
order by a.date;

En particulier, vous voulez que le trié par dans la sous-requête soit sûr que les données sont traitées dans le bon ordre.


0 commentaires