Дополнительные функции суммирования в SQL-строке
В базе есть таблица R_R. Если выбрать из неё всё, что есть (без фильтров) то это будет весь итоговый бюджет по кодам. Если из всех кодов выбрать только раздел, целевую статью и фонд, то можно получить такую выборку:
Довольно неудобно то, что тут не видно общей суммы. Чтобы её узнать надо скопировать это в Excel и просуммировать там.
Самый постой способ увидеть итог это добавить после GROUP BY ROLLUP (). Он, правда ещё кучу промежуточных итогов насчитает, но нужное тоже в конце будет:
А ещё сразу видны итоги, например, по разделам. Тоже полезно.
Близкое к ROLLUP выражение – CUBE:
SELECT TOP (100) PERCENT dbo.K_LSR.CPR, dbo.K_LSR.CDEP, SUM(dbo.R_R.SUMM) AS Summ
FROM dbo.R_R INNER JOIN
dbo.K_LSR ON dbo.R_R.K_LSRID = dbo.K_LSR.K_LSRID
GROUP BY CUBE (dbo.K_LSR.CPR, dbo.K_LSR.CDEP)
Оно позволяет получить то же самое, но иначе отсортированное. Мне сложно это описать, проще положить файл с результатами двух выборок:
https://drive.google.com/file/d/1f8pir0s6FxDvjsPtx-GNdELlbimlL8eZ/view?usp=sharing
GROUPING SETS выдаёт суммы по всем отдельным полям группировки:
Ниже строки с суммами по CPR без CDEP/
Результат выборки можно несколько облагородить заменив NULL на слова «Итого по» и т.д.
Функция GROUPING возвращает 1 или 0 в зависимости от того является ли это поле полем группировки в этой строке:
Это можно обработать стандартный CASE. Примерно так это может выглядеть:
|