2016-02-25 48 views
-1

感謝任何人對此的想法。 我不得不'降級'到Oracle數據庫,最近我有一個在11G中工作的Oracle SQL PIVOT視圖,現在我必須重新創建這個數據透視表。這是我的PIVOT視圖。任何想法如何在沒有PIVOT操作員的情況下重新編寫此視圖?如何創建一箇舊學校Oracle數據透視圖

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

老同學甲骨文大師會建議你更換''01 -AUG-15''with'TO_DATE('01 -AUG-15' , 'MM-MON-YY' ,'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是一個日期列,而不是一個字符串 - 我希望它是 - 那麼你應該使用一個實際的日期,而不是依靠隱式轉換;如果您確定會話日期語言始終爲英語,或者在該轉換中指定NLS_DATE_LANGUAGE(如Kordiko在註釋中顯示)或使用不是NLS敏感的不同格式掩碼,則可以使用to_date('01-JAN-15', 'DD-MON-RR');或用ANSI日期文字:

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

真心感謝您的幫助!因爲我沒有使用病例陳述,所以我的嘗試絕對沒有問題。非常感謝! – Ewaver