sql - 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 通常是此类查询的首选。
解决方案
使用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)
);
推荐阅读
- java - DynamoDB DynamoDBAutoGenerateStrategy.CREATE 不适用于 DynamoDBMapperConfig.SaveBehavior.UPDATE_SKIP_NULL_ATTRIBUTES
- vagrant - 如何将本地 box 文件添加到 vagrant box
- unit-testing - 开玩笑测试连接的 redux 容器组件
- node.js - /v3/contactdb/recipients 的 SendGrid 403 响应 - 需要权限
- python - 如何键入可以获取列表或元组的列表或元组的函数?
- c++ - StreamTransformationFilter:使用 AES 解密发现无效的 PKCS #7 块填充
- java - 通过反射区分方法是否具有任意数量的参数
- amazon-web-services - AWS - 通过 CloudFront HTTPS 分配访问 S3 存储桶时返回 InvalidAccessKeyId
- reactjs - ReactJS + Antd - 分页动态行扩展问题
- node.js - nodejs应用在localhost上运行时,如何与api网关aws集成?