gpt4 book ai didi

sql - Oracle RATIO_TO_REPORT 和汇总

转载 作者:行者123 更新时间:2023-12-04 14:34:20 25 4
gpt4 key购买 nike

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 值是错误的。

最佳答案

有一个函数 GROUPINGdocumented 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com