2
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の値が間違っています。

4

2 に答える 2

5

ここに記載されている関数GROUPINGがあります。この関数は、特定の行が「超集計」行であるかどうかを示します。次に、その行の値に基づいて注文できます。

通常の行と「超集計」行を別々にグループ化しているため、PCT_JOB列の定義は少しわかりにくいことに注意してください。

以下の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)

例を示すSQLFiddleが利用可能です

于 2012-04-17T20:45:16.397 に答える
4

これが外部クエリを必要としない答えです。これはMikeMeyersの回答に基づいていますが、ラインコードのGROUPINGは、PARTITIONBY句内およびORDERBY句内でも指定されています。

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

上記のコードはGROUPBYGROUPING SETSを使用していますが、次のGROUPBYも機能します。

GROUP BY home_dept, ROLLUP(linecode)

また、参考までに:元の質問では、ラインコードをラインコード値(つまりラインコード名)ではなく、パーセントで降順に並べ替える必要がありました。ただし、この例では、「パーセントで降順」の結果は「昇順」と同じように見えました。名前で。" パーセントに関係なく、名前の昇順でラインコードを表示したい場合は、ORDERBY行を次のように変更できます。

ORDER BY home_dept, linecode
于 2014-08-05T17:43:41.547 に答える