2016-11-30 67 views
1

我現在有一個Oracle TABEL看起來像這樣的數據:甲骨文 - select語句轉動和更改數據如何顯示

Person_ID Fieldname    Fieldnumber 
123   2016 Salary   50000 
123   2015 Salary   45000 
123   2014 Salary   40000 
123   2016 Vacation Days  5 
456   2016 Salary   50000 
456   2016 Vacation Days  5 
789   2016 Salary   90000 
789   2016 Vacation Days  5 

我想編寫一個查詢語句來支點和改變的顯示數據,所以它看起來是這樣的:

Person_ID Fieldname  2016   2015   2014 
123   Salary   55000  45000  40000 
123   Vacation Days 5 
456   Salary   50000  
456   Vacation Days 5         
789   Salary   90000           
789   Salary   5 

我怎麼能做到這一點,因此如果添加了新的字段名,我的SQL會自動當我運行它添加新列?有沒有辦法與樞軸做到這一點,或者我應該使用聯盟還是另一個我不熟悉的功能?

我通常運行樞軸看起來是這樣,但我不認爲這個概念會在這種情況下工作:

select * 
    from cust_matrix 
unpivot 
(
    state_counts 
    for state_code in ("New York","Conn","New Jersey","Florida","Missouri") 
) 
order by "Puchase Frequency", state_code 

謝謝

+0

我不明白你最後的評論;你通常運行'UNPIVOT'來轉發數據?那樣有用嗎? – mathguy

回答

1

不要被事實有混淆兩列不是「數據透視」的一部分,在你的案例person_idfieldname。旋轉方式完全相同。

注意 - 您的輸入表明顯缺少列名(年份) - 哪一年最好不要是Oracle,Oracle中的保留字。我在樣本輸入中使用了yr。你的輸出中還有一個錯字(其中55000來自哪裏,2016年和person_id = 123?輸入有50000)。

而且,您可以將2016作爲列名稱,但它必須用雙引號引起,並且可能會在稍後導致意外問題。最好使用標準列名 - 特別是不能以數字開頭的名稱。我用y2016

with 
    inputs (person_id, yr, fieldname, fieldnumber) as (
     select 123, 2016, 'Salary'  , 50000 from dual union all 
     select 123, 2015, 'Salary'  , 45000 from dual union all 
     select 123, 2014, 'Salary'  , 40000 from dual union all 
     select 123, 2016, 'Vacation Days',  5 from dual union all 
     select 456, 2016, 'Salary'  , 50000 from dual union all 
     select 456, 2016, 'Vacation Days',  5 from dual union all 
     select 789, 2016, 'Salary'  , 90000 from dual union all 
     select 789, 2016, 'Vacation Days',  5 from dual 
    ) 
-- end of test data; actual solution (SQL query) begins below this line 
select person_id, fieldname, y2016, y2015, y2014 
from inputs 
pivot (max(fieldnumber) for yr in (2016 as y2016, 2015 as y2015, 2014 as y2014)) 
order by person_id, fieldname 
; 

PERSON_ID FIELDNAME  Y2016 Y2015 Y2014 
--------- ------------- ----- ----- ----- 
123  Salary   50000 45000 40000 
123  Vacation Days  5  
456  Salary   50000  
456  Vacation Days  5  
789  Salary   90000  
789  Vacation Days  5