2015-09-20 40 views
2

我试图根据不同的分组显示百分等级..我最初尝试的代码类似于下面的代码。Oracle SQL PERCENT_RANK在多个分组中汇总数据

我没有意识到的问题是'over partition'不会忽略我拥有的分组。由于我无法找到解决方法...我最终使用CTE将数据分组到我想要的百分比排名中,然后对每个需要的百分位组使用子查询(10+)。

是否有更有效的方法来做我想要的东西?

SELECT 
,employee 
,dept 
,location 
,shift 
,fq 
,fm 
,day 
,sum(calls) 
,sum(handletime) 

/*YTD P RANKS */ 

,PERCENT_RANK() over (partition by dept order by DECODE(sum(calls),0,0,sum(handletime)/sum(calls)) DESC) as YTD_P_RANK_ALL_LOCATIONS 
,PERCENT_RANK() over (partition by dept, location by DECODE(sum(calls),0,0,sum(handletime)/sum(calls)) DESC) as YTD_P_RANK_LOCAL_LOCATION 
,PERCENT_RANK() over (partition by dept, shift by DECODE(sum(calls),0,0,sum(handletime)/sum(calls)) DESC) as YTD_P_RANK_SHIFT 

/*QTD P RANKS */ 

,PERCENT_RANK() over (partition by fq, dept order by DECODE(sum(calls),0,0,sum(handletime)/sum(calls)) DESC) as QTD_P_RANK_ALL_LOCATIONS 
,PERCENT_RANK() over (partition by fq, dept, location by DECODE(sum(calls),0,0,sum(handletime)/sum(calls)) DESC) as QTD_P_RANK_LOCAL_LOCATION 
,PERCENT_RANK() over (partition by fq, dept, shift by DECODE(sum(calls),0,0,sum(handletime)/sum(calls)) DESC) as QTD_P_RANK_SHIFT 


from table1 

group by 

,employee 
,dept 
,location 
,shift 
,fq 
,fm 
,day 
+0

你是什么意思*“我没有意识到的问题是''​​分区'不会忽略我的分组”* - 你的意思是你没有意识到窗口函数(和他们的'PARTITION BY'子句)是根据“GROUP BY”子句的结果进行评估的?另外,与您有不同的结果格式,例如不同的百分比等级放在不同的行中,而不是全部放在一行中? –

+0

是的..我从来没有真正使用PARTITION BY之前,我最初认为它是独立的选择分组。 我对Oracle SQL/PL有点新鲜。我会诚实地说,我通常只是对事情进行修改,直到他们做我需要他们做的事情......这一个让我陷入困境。 将结果放在自己的行中的想法对我来说似乎是更好的方法。我很乐意提供任何帮助。我刚刚检查了..现在要做163行。 (15个CTEs,12个subquerys) – yeahthisisrob

回答

1

(编辑)我想你可能会得到这个工作,如果你在3个步骤分割你的查询:

  1. 首先计算的款项。
  2. 计算百分比排名。
  3. 应用您的最终group by

希望这能让你更接近你想要做的事。

WITH SumView AS (
    SELECT t.* 
     ,sum(calls) over (partition by dept) AS sum_call_by_dept 
     ,sum(handletime) over (partition by dept) AS sum_ht_by_dept 
     ,sum(calls) over (partition by dept, location) AS sum_call_by_dept_loc 
     ,sum(handletime) over (partition by dept, location) AS sum_ht_by_dept_loc 
     ,sum(calls) over (partition by dept, shift) AS sum_call_by_dept_shift 
     ,sum(handletime) over (partition by dept, shift) AS sum_ht_by_dept_shift 
     ,sum(calls) over (partition by fq, dept) AS sum_call_by_fq_dept 
     ,sum(handletime) over (partition by fq, dept) AS sum_ht_by_fq_dept 
     ,sum(calls) over (partition by fq, dept, location) AS sum_call_by_fq_dept_loc 
     ,sum(handletime) over (partition by fq, dept, location) AS sum_ht_by_fq_dept_loc 
     ,sum(calls) over (partition by fq, dept, shift) AS sum_call_by_fq_dept_shift 
     ,sum(handletime) over (partition by fq, dept, shift) AS sum_ht_by_fq_dept_shift 
    FROM table1 t 
), PercentRankView AS (
    SELECT t.* 
     /*YTD P RANKS */ 

     ,PERCENT_RANK() over (partition by dept order by DECODE(sum_call_by_dept,0,0,sum_ht_by_dept/sum_call_by_dept) DESC) as YTD_P_RANK_ALL_LOCATIONS 
     ,PERCENT_RANK() over (partition by dept, location by DECODE(sum_call_by_dept_loc,0,0,sum_ht_by_dept_loc/sum_call_by_dept_loc) DESC) as YTD_P_RANK_LOCAL_LOCATION 
     ,PERCENT_RANK() over (partition by dept, shift by DECODE(sum_call_by_dept_shift,0,0,sum_ht_by_dept_shift/sum_call_by_dept_shift) DESC) as YTD_P_RANK_SHIFT 

     /*QTD P RANKS */ 

     ,PERCENT_RANK() over (partition by fq, dept order by DECODE(sum_call_by_fq_dept,0,0,sum_ht_by_fq_dept/sum_call_by_fq_dept) DESC) as QTD_P_RANK_ALL_LOCATIONS 
     ,PERCENT_RANK() over (partition by fq, dept, location by DECODE(sum_call_by_fq_dept_loc,0,0,sum_ht_by_fq_dept_loc/sum_call_by_fq_dept_loc) DESC) as QTD_P_RANK_LOCAL_LOCATION 
     ,PERCENT_RANK() over (partition by fq, dept, shift by DECODE(sum_call_by_fq_dept_shift,0,0,sum_ht_by_fq_dept_shift/sum_call_by_fq_dept_shift) DESC) as QTD_P_RANK_SHIFT 
    FROM SumView t 
) 
SELECT employee 
     ,dept 
     ,location 
     ,shift 
     ,fq 
     ,fm 
     ,day 
     ,sum(calls) 
     ,sum(handletime) 
     ,YTD_P_RANK_ALL_LOCATIONS 
     ,YTD_P_RANK_LOCAL_LOCATION 
     ,YTD_P_RANK_SHIFT 
     ,QTD_P_RANK_ALL_LOCATIONS 
     ,QTD_P_RANK_LOCAL_LOCATION 
     ,QTD_P_RANK_SHIFT 
    FROM PercentRankView 
GROUP BY employee 
      ,dept 
      ,location 
      ,shift 
      ,fq 
      ,fm 
      ,day 
      ,YTD_P_RANK_ALL_LOCATIONS 
      ,YTD_P_RANK_LOCAL_LOCATION 
      ,YTD_P_RANK_SHIFT 
      ,QTD_P_RANK_ALL_LOCATIONS 
      ,QTD_P_RANK_LOCAL_LOCATION 
      ,QTD_P_RANK_SHIFT 
+0

感谢您的回复。我认为这个建议能够很好地解决,但我认为它可以解决数据总结问题。我得到'不是一个单一的分组功能'。由于你无法在table1内进行总和选择。在测量百分位数之前,数据需要按组进行求和。 – yeahthisisrob

+0

我的不好。我将注意力集中在'percent_rank()'上,并没有注意到分析函数的'by by'子句中的'sum'。我编辑了我的答案。我不能说我对此充满信心,因为我甚至不确定自己完全理解了您的查询意图。但希望它能让您更接近您感觉舒适的工作解决方案。祝你好运。 – sstan

+0

这有帮助,谢谢!我为每个不同的总计分组使用CTE。我没有想到如何使用窗口函数在一个CTE中完成所有工作......这是一个很大的进步。再次感谢。可悲的是,它说我没有足够的“代表”来投票你的答案 – yeahthisisrob