Допустим, нужно одновременно получить статистику:
- по стране и городу;
- только по стране;
- общий итог.
Часто пишут так:
SELECT country, city, SUM(revenue)
FROM sales
GROUP BY country, city
UNION ALL
SELECT country, NULL, SUM(revenue)
FROM sales
GROUP BY country
UNION ALL
SELECT NULL, NULL, SUM(revenue)
FROM sales;
Но SQL умеет это нативно:
SELECT
country,
city,
SUM(revenue) AS revenue
FROM sales
GROUP BY GROUPING SETS (
(country, city),
(country),
()
);
() означает grand total.
А если нужно понять, настоящий ли NULL лежит в данных или это строка итогов:
GROUPING(country)
GROUPING(city)
вернут 1 для колонок, которые были свернуты агрегированием.
🔥 Особенно полезно для:
OLAP-запросов;
аналитических отчётов;
дашбордов;
многоуровневых итогов;
запросов, где иначе появляется несколько почти одинаковых GROUP BY.
Ещё есть:
ROLLUP(...)
CUBE(...)
ROLLUP строит иерархические итоги, а CUBE - все комбинации измерений.
Если в аналитическом SQL у вас появляется цепочка из GROUP BY + UNION ALL, возможно, вы просто забыли про GROUPING SETS.
#SQL #PostgreSQL #DataEngineering #Analytics