2017-02-03 16 views
0

月の値が列である各月の計算値を表示するレポートを生成しようとしています。集計関数を使用したPIVOT

SELECT ROUND(SUM(REVENUE)/SUM(HEADCOUNT), 2), MONTH FROM TABLE 
GROUP BY MONTH 

しかし、私はテーブルを旋回するようにしようとした場合、私は一貫してORA-56902エラーが出ます::「ピボット操作内部の集約関数を期待」を

ベースのクエリは、行としてヶ月を報告してうまく機能します:

SELECT * FROM (
SELECT REVENUE, HEADCOUNT, MONTH FROM TABLE 
) 
PIVOT (ROUND(SUM(REVENUE)/SUM(HEADCOUNT), 2) FOR MONTH IN ('APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC', 'JAN', 'FEB', 'MAR')) 

集計関数として(2、SUM(収益)/ SUM(人員))ROUNDを参照するPIVOTを取得する方法はありますか、私が使用してしなければならない他のいくつかの機能があります。

答えて

2

私は、条件付きの集約を使用して助言する:

SELECT ROUND(SUM(CASE WHEN MONTH = 'APR' THEN REVENUE END)/ 
      SUM(CASE WHEN MONTH = 'APR' THEN HEADCOUNT END 
       ), 2) as APR, 
     ROUND(SUM(CASE WHEN MONTH = 'MAY' THEN REVENUE END)/ 
      SUM(CASE WHEN MONTH = 'MAY' THEN HEADCOUNT END 
       ), 2) as MAY, 
     . . . 
FROM TABLE; 

私はあなた使用ピボットことを指摘しなければなりません。ただ、サブクエリで要約して、ピボットを計算します。

SELECT * 
FROM (SELECT MONTH, ROUND(SUM(REVENUE)/SUM(HEADCOUNT), 2) as val 
     FROM TABLE 
     GROUP BY MONTH 
    ) m 
PIVOT (MAX(val)) FOR MONTH IN ('APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC', 'JAN', 'FEB', 'MAR')) 
+0

これらの両方のソリューションがうまくいきます。私はあなたの2番目の答えに似た何かを試していたと誓っていたかもしれませんが、何かを残しておく必要があります。 –

0

PIVOTは無条件で、集約関数が必要です。

1つの方法は、サブクエリで値を計算し、次にピボットを行うことです。

select * 
from (
    select 
    round(sum(revenue)/sum(headcount), 2) val, 
    month 
    from table 
    group by month 
) 
pivot (
    max(val) 
    for month in ('APR', 'MAY', 'JUN', 
    'JUL', 'AUG', 'SEP', 'OCT', 
    'NOV', 'DEC', 'JAN', 
    'FEB', 'MAR') 
) 
関連する問題