我正在尝试生成一些报告,显示月份值为列的每个月的计算值。
基本查询可以很好地将月份报告为行:
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)作为聚合函数,或者我应该使用其他函数。
答案 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')
)