WITH T AS (
SELECT SUM(AmountCollected) AS SubTotal, YEAR([Date]) AS Y, MONTH([Date]) AS M,
ROW_NUMBER() OVER (ORDER BY YEAR([Date]), MONTH([Date])) AS OrderID
FROM TestTable
GROUP BY YEAR([Date]), MONTH([Date])
)
SELECT Y, M, SubTotal,
(SELECT SUM(T.SubTotal) FROM T WHERE OrderID <= A.OrderID) AS RunningTotal
FROM T AS A
ORDER BY Y, M
Вот еще одна версия без использования подзапроса, которая должна сделать его быстрее:
WITH T AS (
SELECT SUM(AmountCollected) AS SubTotal, YEAR([Date]) AS Y, MONTH([Date]) AS M,
ROW_NUMBER() OVER (ORDER BY YEAR([Date]), MONTH([Date])) AS OrderID
FROM TestTable
GROUP BY YEAR([Date]), MONTH([Date])
)
SELECT A.Y, A.M, A.SubTotal, A.SubTotal + ISNULL(B.SubTotal, 0) AS RunningTotal
FROM T AS A
LEFT JOIN T AS B ON A.OrderID = B.OrderID + 1
ORDER BY A.Y, A.M
Поле RunninigTotal
добавляет текущую строку SubTotal
с предыдущей строкой SubTotal
. Не используя другую SUM для вычисления RunningTotal
, вы повышаете скорость, избегая добавления каждой строки к значениям всех предыдущих строк.