Créons d'abord une table avec des données fictives :
Create Table CUMULATIVESUM (id tinyint , SomeValue tinyint)
Insérons maintenant quelques données dans le tableau ;
Insert Into CUMULATIVESUM
Select 1, 10 union
Select 2, 2 union
Select 3, 6 union
Select 4, 10
Ici, je joins la même table (auto-jonction).
Select c1.ID, c1.SomeValue, c2.SomeValue
From CumulativeSum c1, CumulativeSum c2
Where c1.id >= c2.ID
Order By c1.id Asc
Résultat :
ID SomeValue SomeValue
-------------------------
1 10 10
2 2 10
2 2 2
3 6 10
3 6 2
3 6 6
4 10 10
4 10 2
4 10 6
4 10 10
Nous y voilà, il suffit d'additionner les valeurs de t2 et nous aurons la réponse :
Select c1.ID, c1.SomeValue, Sum(c2.SomeValue) CumulativeSumValue
From CumulativeSum c1, CumulativeSum c2
Where c1.id >= c2.ID
Group By c1.ID, c1.SomeValue
Order By c1.id Asc
Pour SQL Server 2012 et supérieur (performances bien meilleures) :
Select
c1.ID, c1.SomeValue,
Sum (SomeValue) Over (Order By c1.ID )
From CumulativeSum c1
Order By c1.id Asc
Résultat souhaité :
ID SomeValue CumlativeSumValue
---------------------------------
1 10 10
2 2 12
3 6 18
4 10 28
Drop Table CumulativeSum
6 votes
Obtenir des totaux courants en T-SQL n'est pas difficile, il existe de nombreuses réponses correctes, la plupart d'entre elles étant assez simples. Ce qui n'est pas facile (ou même possible à l'heure actuelle), c'est d'écrire une vraie requête en T-SQL pour les totaux courants qui soit efficace. Elles sont toutes O(n^2), bien qu'elles pourraient facilement être O(n), sauf que T-SQL n'est pas optimisé pour ce cas. Vous pouvez obtenir O(n) en utilisant des curseurs et/ou des boucles While, mais alors vous utilisez des curseurs. ( blech ! )