Oracle SQL PERCENT_RANK 多个分组内的汇总数据
Oracle SQL PERCENT_RANK Summed Data Within Multiple Groupings
我正在尝试显示基于不同分组的百分比排名。我最初尝试的代码类似于下面的代码。
我没有意识到的问题是 '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
(已编辑)我想如果您将查询分为 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
我正在尝试显示基于不同分组的百分比排名。我最初尝试的代码类似于下面的代码。
我没有意识到的问题是 '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
(已编辑)我想如果您将查询分为 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