带有SUM的Oracle PARTITION BY GROUPING_ID

时间:2016-01-03 00:34:49

标签: sql oracle rank window-functions

我正在尝试实施一个简单的数据仓库分析查询,处理'YEAR_VALUE','MONTH_VALUE'和'INVOICE_COST'

SELECT YEAR_VALUE, MONTH_VALUE, SUM (INVOICE_VALUE) AS TOTAL_INVOICE,
RANK () OVER (PARTITION BY GROUPING_ID (YEAR_VALUE, MONTH_VALUE) ORDER BY SUM (INVOICE_VALUE) DESC) AS YEAR_RANK,
RANK () OVER (PARTITION BY YEAR_VALUE, GROUPING_ID (MONTH_VALUE) ORDER BY SUM (INVOICE_VALUE) DESC) AS MONTH_RANK
FROM FACT_WH
JOIN TIME_WH ON TIME_WH.TIME_ID = FACT_WH.TIME_ID
GROUP BY (YEAR_VALUE, MONTH_VALUE);

输出是: Output

'YEAR_RANK'应表示年度总发票金额与其他年份相比,2016年有YEAR_RANK = 1且2015年有YEAR_RANK = 2

问题是'YEAR_RANK'的值为1,2,3,4,5应该是1,1,2,2,1 我在代码中找不到问题,可能在第2行,我尝试了所有内容并浪费了很多时间。

提前致谢。

1 个答案:

答案 0 :(得分:0)

一种好的方法,特别是在查询很复杂和/或提供令人困惑的结果的情况下,将整个查询划分为每个解决特定任务的子查询。

在您的情况下,我建议首先在YEAR和月份上攻击事实和维度表的连接以计算total_invoice

您可以获得

等结果
YEAR_VALUE MONTH_VALUE TOTAL_INVIOCE
---------- ----------- -------------
      2016           3         29960 
      2016           1         10700 
      2015          11          5100 
      2015           8          1680 
      2016           2           800 

请注意,您不需要任何GROUP BY扩展名,例如GROUPING_ID,您将使用分析函数解决所有问题

在下一步(使用以前的结果作为因子子查询),使用[{1}}的分析版本计算年份和月份总数

在最后一步中,您计算​​RANK。请注意,您需要的那一年 一个DENSE_RANK,否则你会被“跳过”等级,如1,3(由于重复记录一年)。

SUM根本没有分区,year_rank在YEAR分区,因为您在一年内订购月份。

month_rank