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