Задать вопрос

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

Задача: посчитать нарастающие итоги по полю 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 нет. Но она каким-то образом получается из запроса и показывает общий итог по таблице.
  • Вопрос задан
  • 5974 просмотра
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 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ий вариант счита сумму по подитогам, это не совсем та сумма)
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы