Избегаем UNIONов и делаем красивую иерархию в BI Задача: вывести на дашборде данные по всем подрядчикам организаций, по самим организациям и по холдингу.
Базовый метод решения : посчитать каждый уровень отдельно и объединить их через UNION ALL.
Во-первых, это некрасиво. Во-вторых, такой подход заставляет базу несколько раз проходить по таблице, формировать группы, а потом объединять их — много лишней работы.
Можно сделать так: GROUP BY GROUPING SETS
Мы прописываем все нужные группировки в одном месте и получаем тот же результат быстрее: GROUP BY GROUPING SETS ( (organization, product, month), -- Детализация (organization, product), -- Итог по продукту в организации (organization), -- Итог по организации () -- Общий итог )
К тому же, GROUPING SETS автоматически создает флаг (GROUPING()), который позволяет отличить исходные данные от агрегированных и, например, красиво форматировать отчёт (CASE WHEN GROUPING(organization) = 1 THEN ‘Всего по предприятиям’).
Кроме GROUPING SETS, есть ROLLUP (иерархия от частного к общему) и CUBE (все возможные комбинации группировок, как “cross join group by”). GROUPING SETS — самый гибкий из них, потому что позволяет задать точные комбинации, избегая лишних итогов.
В комментариях шпаргалка. Связи : 📌 SQL-фишечка: Псевдоним для окна (WINDOW) 📌 DISTINCT ON: Как выбирать нужное, не нумеруя лишнего
В этом посте были ссылки, но мы их удалили по правилам Сетки