Как получить итоговое значение при использовании нарастающих итогов?

Задача: посчитать нарастающие итоги по полю summa. В каждой строке должна получиться сумма предыдущих строк без текущего значения. Если использовать оконную функцию с параметрами:
rows between unbounded preceding and current row
считаются итоги, включая текущую строку, поэтому пришёл к тому, что считать надо все строки до текущей:
select	[id], [data], [summa], 
		sum([summa]) over	(order by [id]
			rows between unbounded preceding and  1 preceding )
		as [Itog]
from	[dbo].[Operations]

При этом возникает проблема: отсутствует последнее итоговое значение и как его получить без велосипедов разобраться не могу.

Для ясности приведу вариант ответа:
3c1390f367df4af3900bd29e7617d72b.png
Первая строка содержит NULL, т.к. до неё считать было нечего. Последней строки в таблице Operations нет. Но она каким-то образом получается из запроса и показывает общий итог по таблице.
  • Вопрос задан
  • 5917 просмотров
Пригласить эксперта
Ответы на вопрос 1
@pihel
Sql, Oracle, pl/sql, BI, ETL, php, olap
Не знаю как в T-SQL, но в oracle можно так
1. UNION
select id, sum(summa) over	(order by id rows between unbounded preceding and  1 preceding ) as Itog from [dbo].[Operations]
union all
select NULL, SUM(summa) from [dbo].[Operations]


2. Посчитать общий итог в отдельный столбец
select	[id], [data], [summa], 
		sum([summa]) over	(order by [id]
			rows between unbounded preceding and  1 preceding )
		as [Itog],
               sum([summa]) over	( ) as [Itog1]
from	[dbo].[Operations]


3. Можно посчитать подитог без аналитических функций (не знаю правда насколько поменяется производительность), а итоговую строку сформировать функцией rollup (oracle)
select d1.id, SUM(d2.summa)
from [dbo].[Operations] d1 left join [dbo].[Operations] d2
ON( d1.id > d2.id )
group by rollup(d1.id)
order by d1.id

хотя 3ий вариант счита сумму по подитогам, это не совсем та сумма)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы