Запрос использует 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. Какой запрос корректен и наиболее эффективен?Ещё вопросы по теме «Агрегация, GROUP BY и HAVING»
- Что делает оператор `DISTINCT`?
- Что делает `HAVING`?
- Есть таблица `orders(user_id, amount)`. Какой запрос посчитает сумму всех заказов по каждому пользователю?
- Нужно посчитать сумму оплаченных заказов по каждому пользователю. В таблице `orders` есть поля `user_id`, `amount`, `status`. Какой запрос корректен и наиболее эффективен?
- В таблице `users` есть колонка `middle_name`, в которой часто хранится `NULL`. Что вернёт выражение `COUNT(middle_name)`?
- Все вопросы по «Агрегация, GROUP BY и HAVING» →