2016-02-25 5 views
-1

Спасибо за чьи-либо идеи об этом. Мне пришлось «понизить» до базы данных Oracle в последнее время, когда у меня было представление Oracle SQL PIVOT, которое работало в 11G, теперь мне нужно воссоздать этот принцип старой модели «Group by». Вот мой взгляд PIVOT. Любые идеи, как я могу переписать это представление без оператора PIVOT?Как создать старую школу Oracle Pivot View

select JOB_TITLE, 
COUNTRY, 
fte_exp_yrs, 
fte_alloc, 
first_date 
from ROKPI_HC_V3 
pivot (sum(fte_alloc) as mo for (FIRST_DATE) IN 
('01-JAN-15' AS JAN_15, 
'01-FEB-15' AS FEB_15, 
'01-MAR-15' AS MAR_15, 
'01-APR-15' AS APR_15, 
'01-MAY-15' AS MAY_15, 
'01-JUN-15' AS JUN_15, 
'01-JUL-15' AS JUL_15, 
'01-AUG-15' AS AUG_15, 
'01-SEP-15' AS SEP_15, 
'01-OCT-15' AS OCT_15, 
'01-NOV-15' AS NOV_15, 
'01-DEC-15' AS DEC_15 
)) 
where JOB_TITLE = 'MANAGER' or JOB_TITLE = 'NONMANAGER' OR JOB_TITLE = 'CPA' 
order by country; 
+1

Старая школа Oracle гуру рекомендовал бы вам заменить ''01 -AUG-15''with' to_date ('01 -AUG-15' , 'мм пн-уу' , 'NLS_DATE_LANGUAGE = American') ', чтобы сделать его устойчивым к изменениям настроек NLS сеанса клиент/сервер. – krokodilko

ответ

1

Метод «старая школа», чтобы объединить ту же функцию совокупных вы используете в стержне с сазом для каждого значения first_date и группы других столбцов:

select JOB_TITLE, 
COUNTRY, 
fte_exp_yrs, 
sum(case when FIRST_DATE = '01-JAN-15' then fte_alloc end) AS JAN_15, 
sum(case when FIRST_DATE = '01-FEB-15' then fte_alloc end) AS FEB_15, 
sum(case when FIRST_DATE = '01-MAR-15' then fte_alloc end) AS MAR_15, 
sum(case when FIRST_DATE = '01-APR-15' then fte_alloc end) AS APR_15, 
sum(case when FIRST_DATE = '01-MAY-15' then fte_alloc end) AS MAY_15, 
sum(case when FIRST_DATE = '01-JUN-15' then fte_alloc end) AS JUN_15, 
sum(case when FIRST_DATE = '01-JUL-15' then fte_alloc end) AS JUL_15, 
sum(case when FIRST_DATE = '01-AUG-15' then fte_alloc end) AS AUG_15, 
sum(case when FIRST_DATE = '01-SEP-15' then fte_alloc end) AS SEP_15, 
sum(case when FIRST_DATE = '01-OCT-15' then fte_alloc end) AS OCT_15, 
sum(case when FIRST_DATE = '01-NOV-15' then fte_alloc end) AS NOV_15, 
sum(case when FIRST_DATE = '01-DEC-15' then fte_alloc end) AS DEC_15 
from ROKPI_HC_V3 
where JOB_TITLE = 'MANAGER' or JOB_TITLE = 'NONMANAGER' OR JOB_TITLE = 'CPA' 
group by JOB_TITLE, COUNTRY, fte_exp_yrs 
order by country; 

Этих это то, что Oracle делает в любом случае under the hood with a pivot.

Если FIRST_DATE является столбцом даты, а не строкой, и я надеюсь, что это - тогда вы должны использовать фактическую дату, а не полагаться на неявное преобразование; либо с to_date('01-JAN-15', 'DD-MON-RR'), если вы уверены, что язык сеанса всегда будет на английском языке, или укажите NLS_DATE_LANGUAGE в этом преобразовании (как показывает Кордико в комментарии) или с другой маской формата, которая не чувствительна к NLS; или с датой ANSI буквального:

sum(case when FIRST_DATE = date '2015-01-01' then fte_alloc end) AS JAN_15, 
+0

Настоятельно благодарен вам за помощь! Я был определенно в моих попытках, так как не использовал аргумент case. Спасибо огромное! – Ewaver