Нужно в одном запросе получить итоги отдельно по каждому городу, отдельно по каждому продукту и общий итог — три уровня без их совместной комбинации. Какое выражение даёт именно эти три уровня?
A
ROLLUP(city, product) — даёт нужные три уровня через иерархическую свёрткуB
CUBE(city, product) — перебирает все подмножества и включает нужные уровниCОбычный
GROUP BY city, product с двумя отдельными UNION ALL-блоками для итоговD
GROUPING SETS((city), (product), ()) — явно перечисляет три нужных уровня агрегацииПравильный ответ.
GROUP BY GROUPING SETS((city),(product),()) явно перечисляет три нужных уровня: по городу, по продукту и общий итог — без лишних комбинаций.Разбор
GROUPING SETS позволяет задать точный список комбинаций группировки. ROLLUP(city, product) генерирует (city, product), (city), () — три уровня с лишней совместной комбинацией. CUBE(city, product) генерирует все четыре: (city,product), (city), (product), () — с лишней парой. GROUPING SETS((city),(product),()) — единственный точный способ получить ровно нужные три уровня без лишних строк.
Проверь себя · 1/3разбор после ответа
Что делает
HAVING?Ещё вопросы по теме «Агрегация, GROUP BY и HAVING»
- Что делает оператор `DISTINCT`?
- Что делает `HAVING`?
- Есть таблица `orders(user_id, amount)`. Какой запрос посчитает сумму всех заказов по каждому пользователю?
- Нужно посчитать сумму оплаченных заказов по каждому пользователю. В таблице `orders` есть поля `user_id`, `amount`, `status`. Какой запрос корректен и наиболее эффективен?
- В таблице `users` есть колонка `middle_name`, в которой часто хранится `NULL`. Что вернёт выражение `COUNT(middle_name)`?
- Все вопросы по «Агрегация, GROUP BY и HAVING» →