📊 SQL трюк — как добавить строку «Все категории» к любому отчёту через ROLLUP (ЧАСТЬ 2):
В прошлом посте мы добавляли итоговую строку через UNION ALL — это рабочий метод, но есть способ элегантнее.
Знакомьтесь:
GROUP BY ROLLUP — встроенный механизм SQL для автоматических итогов.
🟢 Что такое ROLLUP на пальцах:
ROLLUP — это расширение GROUP BY, которое автоматически добавляет строки с агрегатными итогами. Вместо того чтобы писать второй запрос и клеить через UNION ALL — просто добавляем одно слово
🟢 Шаг 1 — пишем запрос с ROLLUP:
SELECT
category,
SUM(revenue) AS total_revenue,
COUNT(order_id) AS orders_count
FROM orders
GROUP BY ROLLUP(category)
Результат:
category | total_revenue | orders_count
Одежда | 7000 | 2
Обувь | 1200 | 1
Техника | 2500 | 1
NULL | 10700 | 4
Итоговая строка появилась автоматически, но в поле category стоит NULL — это сигнал ROLLUP, что строка является итогом по всей группе.
🟢 Шаг 2 — заменяем NULL на «Все категории»:
Используем COALESCE, чтобы подменить NULL на читаемую метку:
SELECT
COALESCE(category, 'Все категории') AS category,
SUM(revenue) AS total_revenue,
COUNT(order_id) AS orders_count
FROM orders
GROUP BY ROLLUP(category)
Результат:
category | total_revenue | orders_count
Одежда | 7000 | 2
Обувь | 1200 | 1
Техника | 2500 | 1
Все категории | 10700 | 4
Чисто и лаконично — никакого второго запроса.
🟢 Важный момент — а что если в данных уже есть NULL в category?
Представим, что в таблице есть строки с незаполненной категорией:
order_id | category | revenue
1 | Одежда | 1500
2 | Обувь | 1200
3 | NULL | 800 ← категория не указана
4 | Одежда | 5500
Запускаем запрос с COALESCE — и получаем проблему:
category | total_revenue | orders_count
Одежда | 7000 | 2
Обувь | 1200 | 1
Все категории | 800 | 1 ← это был NULL из данных!
Все категории | 10700 | 4 ← это реальный итог ROLLUP
COALESCE не различает: это NULL из данных или NULL от ROLLUP — он заменяет оба.
🟢 Решение — используем GROUPING():
Функция GROUPING(column) возвращает 1, если строка итоговая (от ROLLUP), и 0 — если это обычная строка с NULL из данных:
SELECT
CASE
WHEN GROUPING(category) = 1 THEN 'Все категории'
ELSE COALESCE(category, 'Не указана')
END AS category,
SUM(revenue) AS total_revenue,
COUNT(order_id) AS orders_count
FROM orders
GROUP BY ROLLUP(category)
ORDER BY
GROUPING(category),
category
Результат:
category | total_revenue | orders_count
Не указана | 800 | 1 ← NULL из данных
Одежда | 7000 | 2
Обувь | 1200 | 1
Все категории | 10700 | 4 ← итог ROLLUP
Теперь всё на своих местах.
🟢 Хотите еще таких лайфхаков ?
🔥 Набираем 70 реакций на этот пост, чтобы подобные посты выходили чаще
Итог: 🤩
❤️ Поддержать канал бустами, чтобы у автора появился дополнительный функционал можно - здесь (это бесплатно и доступно с подпиской telegram premium)
❓ А знали про ROLLUP и GROUPING() раньше? Делитесь в комментариях!
✔️ Подпишитесь на канал, чтобы не пропустить следующие хаки.
🚬 Вопросы, обучение, консультации: Написать в ЛС | mentor.dima-sqlit.ru
@dima_sqlit
В прошлом посте мы добавляли итоговую строку через UNION ALL — это рабочий метод, но есть способ элегантнее.
Знакомьтесь:
GROUP BY ROLLUP — встроенный механизм SQL для автоматических итогов.
🟢 Что такое ROLLUP на пальцах:
ROLLUP — это расширение GROUP BY, которое автоматически добавляет строки с агрегатными итогами. Вместо того чтобы писать второй запрос и клеить через UNION ALL — просто добавляем одно слово
🟢 Шаг 1 — пишем запрос с ROLLUP:
SELECT
category,
SUM(revenue) AS total_revenue,
COUNT(order_id) AS orders_count
FROM orders
GROUP BY ROLLUP(category)
Результат:
category | total_revenue | orders_count
Одежда | 7000 | 2
Обувь | 1200 | 1
Техника | 2500 | 1
NULL | 10700 | 4
Итоговая строка появилась автоматически, но в поле category стоит NULL — это сигнал ROLLUP, что строка является итогом по всей группе.
🟢 Шаг 2 — заменяем NULL на «Все категории»:
Используем COALESCE, чтобы подменить NULL на читаемую метку:
SELECT
COALESCE(category, 'Все категории') AS category,
SUM(revenue) AS total_revenue,
COUNT(order_id) AS orders_count
FROM orders
GROUP BY ROLLUP(category)
Результат:
category | total_revenue | orders_count
Одежда | 7000 | 2
Обувь | 1200 | 1
Техника | 2500 | 1
Все категории | 10700 | 4
Чисто и лаконично — никакого второго запроса.
🟢 Важный момент — а что если в данных уже есть NULL в category?
Представим, что в таблице есть строки с незаполненной категорией:
order_id | category | revenue
1 | Одежда | 1500
2 | Обувь | 1200
3 | NULL | 800 ← категория не указана
4 | Одежда | 5500
Запускаем запрос с COALESCE — и получаем проблему:
category | total_revenue | orders_count
Одежда | 7000 | 2
Обувь | 1200 | 1
Все категории | 800 | 1 ← это был NULL из данных!
Все категории | 10700 | 4 ← это реальный итог ROLLUP
COALESCE не различает: это NULL из данных или NULL от ROLLUP — он заменяет оба.
🟢 Решение — используем GROUPING():
Функция GROUPING(column) возвращает 1, если строка итоговая (от ROLLUP), и 0 — если это обычная строка с NULL из данных:
SELECT
CASE
WHEN GROUPING(category) = 1 THEN 'Все категории'
ELSE COALESCE(category, 'Не указана')
END AS category,
SUM(revenue) AS total_revenue,
COUNT(order_id) AS orders_count
FROM orders
GROUP BY ROLLUP(category)
ORDER BY
GROUPING(category),
category
Результат:
category | total_revenue | orders_count
Не указана | 800 | 1 ← NULL из данных
Одежда | 7000 | 2
Обувь | 1200 | 1
Все категории | 10700 | 4 ← итог ROLLUP
Теперь всё на своих местах.
🟢 Хотите еще таких лайфхаков ?
🔥 Набираем 70 реакций на этот пост, чтобы подобные посты выходили чаще
Итог: 🤩
❤️ Поддержать канал бустами, чтобы у автора появился дополнительный функционал можно - здесь (это бесплатно и доступно с подпиской telegram premium)
❓ А знали про ROLLUP и GROUPING() раньше? Делитесь в комментариях!
✔️ Подпишитесь на канал, чтобы не пропустить следующие хаки.
🚬 Вопросы, обучение, консультации: Написать в ЛС | mentor.dima-sqlit.ru
@dima_sqlit