首页 > 解决方案 > Oracle SQL 中四列 ROLLUP 的小计级别

问题描述

我正在尝试使用 ROLLUP 运算符构建 Oracle SQL 查询。查询需要按年份、季度、门店状态和门店城市对两年的销售额进行汇总,结果包括年/季度和州/市两个层次维度的小计。到目前为止,这是我的尝试:

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 示例,或者单个 GROUP BY 子句中两个 ROLLUP 运算符的示例,如下所示:

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

对两个 GROUP BY 子句产生的小计级别进行细分将非常有帮助。

编辑:我专门在这里使用 ROLLUP。否则,GROUPING SETS 通常是此类查询的首选。

标签: sqloracleaggregate-functionshierarchical-datarollup

解决方案


使用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)
                       );

推荐阅读