sql - SQL:所有可能组合的百分比变化
问题描述
我开始学习 SQL 并拥有以下表格(它们包含更多数据,但只有那些对问题来说似乎是必要的)。
物品:
item_keys deparment_desc
----------------------------
10001 Womens Clothing
10002 Womens Clothing
10003 Sporting Goods
销售量:
cur_trn_date item_key store_key tot_sls_qty
----------------------------------------------
1999-12-01 10001 1 8346.17
1999-12-01 10001 2 235.40
.
.
.
2001-12-31 2001-12-31 10 1108.33
店铺:
store_key type_key type_desc
--------------------------------
1 1 Super Malls
2 2 Strip Malls
3 3 Retail Only
.
.
.
10 1 Super Malls
(很抱歉,如果这看起来不是很有条理,我找不到在 StackOverflow 上创建表格的方法)
我想得到的是每年的总销售额以及与去年相比的百分比变化。对于 department_desc 和 type_desc 的所有可能组合,所有这些。我使用以下代码进行了尝试,但 CUBE 和 LAG 函数似乎存在问题。它们是一个意想不到的象征。
SELECT YEAR(s.cur_trn_date) AS year, SUM(s.tot_sls_qty) AS sales,
(SUM(s.tot_sls_qty) - LAG(SUM(s.tot_sls_qty)) / SUM(s.tot_sls_qty)) AS difference
FROM sales s, item i, store st
GROUP BY YEAR(s.cur_trn_date)
CUBE(i.departmend_desc, st.type_desc)
WHERE s.item_key = i.item_key
AND s.store_key = st.store_key
如果有人可以提供帮助或给我一个关于问题可能是什么的线索,那就太好了。
解决方案
根据您的描述,查询应该是:
SELECT YEAR(s.cur_trn_date) AS year,
SUM(s.tot_sls_qty) AS sales,
(SUM(s.tot_sls_qty) - LAG(SUM(s.tot_sls_qty)) /
SUM(s.tot_sls_qty)
) AS difference
FROM sales s JOIN
item i
ON s.item_key = i.item_key JOIN
store st
ON s.store_key = st.store_key
GROUP BY GROUPING_SETS ( (YEAR(s.cur_trn_date)),
(YEAR(s.cur_trn_date), i.departmend_desc, st.type_desc),
(YEAR(s.cur_trn_date), i.departmend_desc),
(YEAR(s.cur_trn_date), st.type_desc)
);
我不确定是否有一个可以实际运行的语法会解决你的问题。(我更喜欢grouping sets
,cube
因为我喜欢明确说明所产生的结果。)
推荐阅读
- graphql - apollo 客户端 nodejs 使用过滤器查询本地状态
- express - 在 Ejs 中使用 Express 会话从一条路线到另一条路线
- java - 将初始化代码添加到 Spring Boot 应用程序的正确方法是什么?
- javascript - 通过 js/react 中的对象数组映射
- java - 如何在 Spring 中编写查询以将记录插入 Mysql 数据库中的 2 个表中
- android - 如何正确计算android设备对角线?
- javascript - 如果它们相同,我可以将字符串与属性名称相关联并相应地应用它们吗
- python - 调用模块时使用可变变量的智能方法
- java - 在查询时有条件地忽略实体中的 a 字段
- python - Python:创建具有多选值的列表。错误:找到一个开放的集合属性。在 OData 中,不支持开放集合属性