具有计算的聚合函数的PIVOT

时间:2017-02-03 16:49:01

标签: sql oracle

我正在尝试生成一些报告,显示月份值为列的每个月的计算值。

基本查询可以很好地将月份报告为行:

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

有没有办法让PIVOT看到ROUND(SUM(REVENUE)/ SUM(HEADCOUNT),2)作为聚合函数,或者我应该使用其他函数。

2 个答案:

答案 0 :(得分: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;

我应该指出你可以使用pivot。只需计算子查询中的摘要,然后转动:

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

答案 1 :(得分: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')
)