Агрегатністандарт SQL

GROUPING

Показує, чи є рядок підсумком ROLLUP чи CUBE для стовпця: 1 — підсумок, 0 — звичайна група.

Синтаксис

GROUPING(<стовпець>)
GROUPING(<стовпець1>, <стовпець2>, …)

ROLLUP додає до звіту рядки-підсумки, де стовпець групування стає NULL. Але NULL буває й справжнім значенням, тож відрізнити підсумок від групи «без відділу» по ньому не вийде. GROUPING дає 1 саме для підсумкового рядка — з ним і підписують «Total».

Дані для прикладів

employees

namedepartmentsalarybonusphone
Emmabackend1200300+44 7700 900123
Liambackend1000NULLNULL
Oliviafrontend1350150+44 7700 900456
Noahfrontend950NULL+44 7700 900789
Sophiadesign1200200NULL

Ці таблиці вже створено в пісочниці — приклади нижче працюють із ними. Хочеш повторити у своїй базі — скопіюй SQL.

Підсумок, позначений GROUPING
SELECT department,
SUM(salary) AS payroll,
GROUPING(department) AS is_total
FROM employees
GROUP BY ROLLUP (department)
ORDER BY is_total, department;
departmentpayrollis_total
backend22000
design12000
frontend23000
NULL57001
Підпис Total замість NULLСкладніше
SELECT CASE WHEN GROUPING(department) = 1 THEN 'Total' ELSE department END AS department,
SUM(salary) AS payroll
FROM employees
GROUP BY ROLLUP (department)
ORDER BY GROUPING(department), department;
departmentpayroll
backend2200
design1200
frontend2300
Total5700

Зверни увагу

Без ROLLUP, CUBE чи GROUPING SETS усі рядки звичайні, і GROUPING завжди дає 0.

Аргумент — лише стовпець із GROUP BY: інакше буде помилка arguments to GROUPING must be grouping expressions of the associated query level.

Для кількох стовпців результат — бітова маска: GROUPING(a, b) дає 0, 1, 2 чи 3. Простіше викликати GROUPING окремо для кожного стовпця.

Схожі функції