SELECT HOME_DEPT, LINECODE, SUM(TOTAL_HRS),
TO_CHAR (
100*RATIO_TO_REPORT(SUM(TOTAL_HRS))
OVER (PARTITION BY HOME_DEPT),
'990.00L', 'NLS_CURRENCY=%'
) PCT_JOB
FROM TABLE
GROUP BY HOME_DEPT, LINECODE ORDER BY HOME_DEPT ASC, PCT_JOB DESC;
上述 Oracle 查询有效并产生如下结果:
DEPT1 LINECODE1 100 50%
DEPT1 LINECODE2 50 25%
DEPT1 LINECODE3 50 25%
DEPT2 LINECODE1 20 12.5%
DEPT2 LINECODE2 20 12.5%
DEPT2 LINECODE3 20 12.5%
DEPT2 LINECODE4 20 12.5%
DEPT2 LINECODE5 20 12.5%
DEPT2 LINECODE6 20 12.5%
DEPT2 LINECODE7 20 12.5%
DEPT2 LINECODE8 20 12.5%
现在我想汇总每个部门以获得这样的结果:
DEPT1 LINECODE1 100 50%
DEPT1 LINECODE2 50 25%
DEPT1 LINECODE3 50 25%
DEPT1 200 100% <--- desired
DEPT2 LINECODE1 20 12.5%
DEPT2 LINECODE2 20 12.5%
DEPT2 LINECODE3 20 12.5%
DEPT2 LINECODE4 20 12.5%
DEPT2 LINECODE5 20 12.5%
DEPT2 LINECODE6 20 12.5%
DEPT2 LINECODE7 20 12.5%
DEPT2 LINECODE8 20 12.5%
DEPT2 160 100.0% <--- desired
我已经尝试了各种方法,例如 GROUPING SETS,但后来我的 PCT_JOB 值是错误的。
最佳答案
有一个函数 GROUPING
是 documented here .此函数将告诉您给定行是否为“ super 聚合”行。然后,您可以根据该行的值进行排序。
请注意,我对 PCT_JOB 列的定义有点困惑,因为我将普通行和“ super 聚合”行分开分组。
下面的 SQL 查询应该可以满足您的需求。
select
home_dept,
linecode,
total_hrs,
to_char(
100 * ratio_to_report(total_hrs) over (partition by home_dept, linecode_group),
'990.00L', 'NLS_CURRENCY=%') as pct_job
from (
SELECT
HOME_DEPT,
LINECODE,
SUM(TOTAL_HRS) as total_hrs,
grouping(linecode) as linecode_group
FROM my_TABLE
GROUP BY grouping sets ((home_dept), (HOME_DEPT, LINECODE))
)
ORDER BY HOME_DEPT ASC, linecode_group, pct_job desc
此外,我在这里使用了分组集,但也可以只使用:
GROUP BY home_dept, rollup(LINECODE)
A SQLFiddle is available这会让你看到一个例子。
关于sql - Oracle RATIO_TO_REPORT 和汇总,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10196270/