Sql Oracle比率报告和汇总

Sql Oracle比率报告和汇总,sql,oracle,Sql,Oracle,上述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

上述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;
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%
现在,我想按部门汇总以获得如下结果:

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;
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行代码1 100 50%
部门1线路代码2 50 25%
部门1线路代码3 50 25%

DEPT1 200 100%有一个函数
分组
,它是。此函数将告诉您给定的行是否为“超级聚合”行。然后可以根据该行的值进行排序

请注意,我对PCT_作业列的定义有点混乱,因为我将普通行和“超级聚合”行分别分组

下面的SQL查询应该提供您所需要的内容

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
此外,我在这里使用了分组集,但也可以只使用:

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

这将让您看到一个示例。

这里有一个不需要外部查询的答案。它基于Mike Meyers的回答,但现在在PARTITION BY子句和ORDER BY子句中指定了行代码的分组:

  GROUP BY home_dept, rollup(LINECODE)
上述代码使用GROUP BY GROUP集合,但以下GROUP BY也可以使用:

SELECT
    home_dept,
    linecode,
    SUM(total_hrs) AS total_hrs, 
    TO_CHAR(100 * RATIO_TO_REPORT (SUM(total_hrs))
            OVER (PARTITION BY home_dept, GROUPING(linecode)),
            '990.00L', 'NLS_CURRENCY=%') AS pct_job
FROM my_table
GROUP BY GROUPING SETS ((home_dept), (home_dept, linecode))
ORDER BY home_dept, GROUPING(linecode), pct_job DESC
仅供参考:原始问题希望线条代码按百分比降序排序,而不是按线条代码值(即线条代码名称)。。。。但在给定的示例中,“按百分比递减”的结果与“按名称递增”的结果相同。如果有人希望按名称递增而不考虑百分比,则可以将“按行递增”更改为:

GROUP BY home_dept, ROLLUP(linecode)

我认为您需要将其封装在一个进行汇总的外部查询中。您是对的。我得到了它的工作,但现在我想订单的百分比下降,但有每个部门行后,所有下降的百分比列出汇总。但是,由于汇总是100%,所以它是首先列出的。我认为您可以执行类似于
…当PCT=100时按情况排序,然后1或0作为PCT结束
不确定语法是否为100%,但我非常确定在ORDER子句中可以有一个表达式。谢谢,好的,因此您的查询也可以工作。Mine(上图)在外部查询中应用FrustedWithFormsDesigner包装建议后工作。但这两个查询都不是按降序提供pct_作业,而是最后一个汇总。见上文对我问题的评论。我一直在处理这个案子,但我不能让它与“100.00%”相匹配好吧,我得到了一个案子的订单。我不得不将_CHAR改为TRUNC,这样WHEN子句处理的是一个数字,而不是character.Oops。忘记更新了。它在SQLFiddle页面上是正确的,但不在答案中。现在修好了。请不要在订购中使用用例,而是使用分组,因为如果给定部门只有一行,那么用例可能会导致问题,因为订购可能是不确定的。是的。谢谢我无法签出SQLFiddle,我的公司将该网站屏蔽为未分类的链接。我将在不久的将来重新访问此应用程序,然后可以测试您的查询。