Определение функции grouping

Объясните, пожалуйста, как работает Grouping в примере. Не ясно, какие данные в выходной таблице являются статистическими, а какие являются данными и почему.

Grouping – функция Transact-SQL, которая возвращает истину, если указанное выражение является статистическим, и ложь, если выражение нестатистическое.

Данная функция создана для того, чтобы отличить статистические строки, которые добавил SQL сервер, от строк, которые и есть сами данные, так как когда используешь много группировок, запутаться в строках очень легко.

CREATE TABLE [dbo].[test_table](
        [id] [INT] IDENTITY(1,1) NOT NULL,
        [manager] [VARCHAR](50) NULL,
        [otdel] [VARCHAR](50) NULL,
        [god] [INT] NULL,
        [summa] [MONEY] NULL
   ) ON [PRIMARY]
   GO



SELECT otdel,
          ISNULL(CAST(god AS VARCHAR(30)), 
                 CASE WHEN GROUPING(god)=1 ANS GROUPING(otdel)=0 
                      THEN 'Промежуточный итог' 
                      ELSE 'Общий итог' END) AS god,
          SUM(summa) AS itog,
          GROUPING(otdel) AS grouping_otdel,
          GROUPING(god) AS grouping_god
   FROM dbo.test_table
   GROUP BY 
   ROLLUP (otdel,god)

Определение взято https://info-comp.ru/obucheniest/444-sql-rollup-cube-grouping-sets.html

Пример выборки с ф-ей GROUPING

Таблица


Ответы (1 шт):

Автор решения: teran

ваш запрос формирует промежуточные итоги с помощью инструкции ROLLUP. Поскольку указаны два поля для итогов, то они у вас есть как по году, так и общие.

в случае обычной группировки, когда вы группируете по году - вполне ясно, что в столбце по которому проводится группировка будет само значение года, а далее допустим, как тут - суммы.

Когда же речь идет про промежуточный итог, СУБД к результату выборки (к обычным строкам, являющимся результатом группировки) добавляет строки промежуточных итогов. И тут значение столбца группировки будет NULL (и на этих строках указанная функция возвращает 1). Вот в данном конкретном случаев с помощью grouping() определяется промежуточный ли это итог, либо общий. и выводится нужное значение поля "Промежуточный итог" или "Общий итог".

→ Ссылка