sql - Oracle RATIO_TO_REPORT 和汇总

标签 sql oracle

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/

相关文章:

c# - 以编程方式更改 Select 中的属性在 LINQ to SQL 查询中的填充方式

php - SQL 查询语法错误?

java - mybatis在插入数据库时​​是否会更改时区?

mysql - 使用 2 个不同的唯一键连接 3 个 MYSQL 表

sql - 从大查询中的特定数字开始查找序列

android:最终得分和高分

sql - 在 Oracle 数据库中查找键是否存在的最快方法

sql - Oracle SQL 从数据创建 PDF

java - 如何从java调用oracle函数

sql - 我如何获得SQL中多列总和的最大值?