2017-02-03 86 views
0

我想生成顯示每月在一個月值列的計算值幾個報告。PIVOT與計算的聚合功能

的基本查詢效果很好上報個月行:

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

但是,如果我嘗試轉動的表,我一直得到ORA-56902錯誤:「希望pivot操作中聚合函數」:

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')) 

有沒有什麼辦法讓PIVOT看到ROUND(SUM(收入)/ SUM(人數),2)聚合函數,或者是有,我應該使用一些其他的功能。

回答

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

這兩種解決方案很好地工作。我可以發誓,我曾試圖類似於你的第二答案的東西,但我必須離開的東西了。 –

0

PIVOT需要一個無條件聚合函數。

一種方法是在子查詢來計算你的價值,然後做轉動。

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') 
)