Запрос использует GROUP BY ROLLUP(region). В исходных данных есть строки с region = NULL. Как отличить суперагрегатную строку (итог по всем) от строки с реальным NULL-регионом?

AПо столбцу GROUPING(region): значение 1 означает реальный NULL в данных, 0 — суперагрегат
BС помощью COALESCE(region, 'Итого') — он заменяет и реальные NULL, и суперагрегатные строки на одинаковое значение
CС помощью GROUPING(region): значение 1 означает суперагрегатную строку, 0 — реальные данные включая строки с NULL-регионом
DРеальные NULL и суперагрегаты неотличимы без изменения исходных данных
Правильный ответ. GROUPING(col) возвращает 1 только для синтетических NULL, добавленных ROLLUP, и 0 для всех реальных данных, включая строки с реальным NULL.

Разбор

GROUPING(expr) — функция SQL:2003, которая возвращает 1, если NULL в данной строке является суперагрегатным маркером, и 0 для реальных значений (включая реальные NULL). COALESCE(region, 'Итого') не различает: он заменит и реальный NULL, и суперагрегат на одну строку. Правильный паттерн: CASE WHEN GROUPING(region)=1 THEN 'Итог' ELSE COALESCE(region,'Нет региона') END.

Проверь себя · 1/3разбор после ответа
Нужно посчитать сумму оплаченных заказов по каждому пользователю. В таблице orders есть поля user_id, amount, status. Какой запрос корректен и наиболее эффективен?
Тренировать SQL в Telegram

Ещё вопросы по теме «Агрегация, GROUP BY и HAVING»