Как стать автором
Обновить

Комментарии 4

Не сильно погружался в запрос, но кажется, что использование Grouping sets вместо 7 uninon all более красивый вариант
SELECT
CASE WHEN GROUPING(created_at) = 1 THEN 'all' ELSE created_at END AS created_at,
CASE WHEN GROUPING(zone_nm) = 1 THEN 'all' ELSE zone_nm END AS zone_nm,
CASE WHEN GROUPING(service_nm) = 1 THEN 'all' ELSE service_nm END AS service_nm,
SUM(duration) AS duration,
COUNT(DISTINCT client_id) AS users_count
FROM mytable
GROUP BY GROUPING SETS (
(created_at, zone_nm, service_nm), -- 1 Полная детализация
(created_at, zone_nm), -- 2 Разрез по created_at + zone_nm
(created_at, service_nm), -- 3 Разрез по created_at + service_nm
(zone_nm, service_nm), -- 4 Разрез по zone_nm + service_nm
(created_at), -- 5 Разрез только по created_at
(zone_nm), -- 6 Разрез только по zone_nm
(service_nm), -- 7 Разрез только по service_nm
() -- Итоговая строка (если нужна)
)

Прикольный вариант, надо будет попробовать, спасибо!

Это же postgres судя по тегам, кто мешает просто написать ROLLUP или CUBE или GROUPING SETS  в GROUP BY?

Зачем изобретать то что есть уже в SQL?

Да, это решение действительно лучше моего UNION ALL 100%

Буду использовать в работе!

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации