De um modo geral, o SQL não foi realmente destinado a produzir "totais em execução" como você deseja. Outros RDBMS introduziram extensões proprietárias para fornecer funções analíticas que permitem cálculos desse tipo, mas o MySQL não possui esses recursos.
Em vez disso, tem-se amplamente quatro opções. Em nenhuma ordem particular:
-
Acumule um total em execução em seu aplicativo, conforme você percorre o conjunto de resultados;
-
Altere seu esquema para acompanhar um total em execução em seu banco de dados (especialmente bom em situações como essa, onde novos dados são anexados apenas "no final");
-
Agrupe uma auto-junção:
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
-
Acumule o total em execução em uma variável de usuário :
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