D'une manière générale, SQL n'était pas vraiment destiné à produire des "totaux cumulés" comme vous le souhaitez. D'autres RDBMS ont introduit des extensions propriétaires pour fournir des fonctions analytiques permettant des calculs de ce type, mais MySQL ne dispose pas de telles fonctionnalités.
Au lieu de cela, on a globalement quatre options. Sans ordre particulier :
-
Accumulez un total cumulé dans votre application, lorsque vous parcourez le jeu de résultats ;
-
Modifiez votre schéma pour garder une trace d'un total cumulé dans votre base de données (particulièrement utile dans des situations comme celle-ci, où les nouvelles données ne sont jamais ajoutées "à la fin");
-
Regrouper une auto-jointure :
SELECT a.Sale_Date, SUM(a.Stock_Delivered) AS Stock_Delivered, SUM(a.Units_Sold) AS Units_Sold, SUM(b.Stock_Delivered - b.Units_Sold) AS `Stock Balance` FROM sales_report a JOIN sales_report b ON b.Sale_Date <= a.Sale_Date GROUP BY a.Sale_Date
-
Cumulez le total cumulé dans une variable utilisateur :
SELECT Sale_Date, Stock_Delivered, Units_Sold, @t := @t + Stock_Delivered - Units_Sold AS `Stock Balance` FROM sales_report, (SELECT @t:=0) init ORDER BY Sale_Date