首页 > 解决方案 > 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

如果有人可以提供帮助或给我一个关于问题可能是什么的线索,那就太好了。

标签: sqllagcube

解决方案


根据您的描述,查询应该是:

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 setscube因为我喜欢明确说明所产生的结果。)


推荐阅读