Уровни промежуточных итогов для ROLLUP по четырем столбцам в Oracle SQL

Я пытаюсь построить запрос Oracle SQL, используя оператор ROLLUP. Запрос должен суммировать продажи по годам, кварталам, штатам магазинов и городам магазинов за два года, с результатом, включающим промежуточные итоги для двух иерархических измерений «год/квартал» и «штат/город». Вот моя попытка до сих пор:

SELECT storestate, storecity, calyear, calquarter, SUM(sales) AS Sales
FROM store_dim, time_dim, sales_fact
WHERE sales_fact.storeid = store_dim.storeid
    AND sales_fact.timenum = time_dim.timenum
    AND (calyear BETWEEN 2011 AND 2012)
GROUP BY ROLLUP(calyear, calquarter, storestate, storecity);

Я пытаюсь выяснить, показывает ли запрос промежуточные итоги для двух иерархий, которые я ищу, вместо того, чтобы рассматривать их как одну большую. Попытка сопоставить уровни промежуточных итогов вручную не помогла, и я не смог найти примеров одного ROLLUP с четырьмя столбцами из двух измерений или примеров двух операторов ROLLUP в одном предложении GROUP BY, как показано ниже:

GROUP BY ROLLUP(calyear, cal quarter), ROLLUP(storestate, storecity)

Разбивка уровней промежуточных итогов, полученных с помощью двух предложений GROUP BY, была бы чрезвычайно полезной.

Изменить: здесь я специально использую ROLLUP. В противном случае GROUPING SETS обычно был бы первым выбором для такого рода запросов.


person quantumferret    schedule 28.07.2018    source источник


Ответы (1)


Используйте grouping sets . . . и правильный, явный, стандартный join синтаксис:

select s.storestate, s.storecity, t.calyear, t.calquarter,
       sum(sf.sales) AS Sales
from sales_fact sf join
     store_dim s
     on s.storeid = sf.storeid join
     time_dim t 
     on sf.timenum = t.timenum
where calyear between 2011 and 2012
group by grouping sets ( (calyear, calquarter, storestate, storecity),
                         (calyear, calquarter), (storestate, storecity)
                       );
person Gordon Linoff    schedule 28.07.2018
comment
К сожалению, задание не требует, чтобы я использовал группирующие наборы позже. Наборы группировки определенно были бы первым оператором, который я бы использовал без этого ограничения. - person quantumferret; 28.07.2018
comment
@квантумферрет . . . Ну, вы можете объединить значения по каждому измерению вместе. Но grouping sets правильный подход. - person Gordon Linoff; 28.07.2018