2017-02-03 5 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')) 

есть ли способ, чтобы получить 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

Оба эти решения работают хорошо. Я мог бы поклясться, что попробовал что-то похожее на ваш 2-й ответ, но, должно быть, я что-то упустил. –

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') 
) 
Смежные вопросы