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?
3 Réponses :
SELECT
b.date,( SELECT sum( a.`value` ) FROM aa a WHERE a.date <= b.date ) value
FROM
aa b
GROUP BY
b.date
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.
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.
Quelle est votre version mysql?
mysql Ver 15.1 Distrib 5.5.35-MariaDB