Oracle 11g Pivot函數實現行轉列

先上語法規範:
SELECT ....
FROM <table-expr>
   PIVOT
     (
      aggregate-function(<column>)
      FOR <pivot-column> IN (<value1>, <value2>,..., <valuen>)
        ) AS <alias>
WHERE .....
經過一個例子說明其用法:
select * from (select salary, department_id from employee) 
pivot(sum(salary) as sum_sal for(department_id) in (10,20,30));
10_sum_sal 20_sum_sal 30_sum_sal
370000	    155000	370000
在這個例子中,工資按照指定部門作彙集後,成爲獨立的列顯示出來。有幾個部門,就有幾列;而老是隻有一行。便是說,達到了行轉列的效果。這種效果的報表在BI/DW應用中很常見。
注意:IN語句是必須的。也就是說,在運行SQL以前必須知道department_id
 
再進一步,按照多個列做行轉列
select * from (select salary, department_id,manager from employee) 
pivot(sum(salary) for(department_id,manager) in ((10,28),(10,null),(20,null)));
10_28   10_null 20_null
270000	100000	90000
這個SQL查詢按照指定部門和經理的組合聚合後的工資。至關於按照兩個維度來作彙集。
 
兩個pivot,這時列數增長1倍。可是for() in()內容須要保持一致,不然Oracle沒法肯定你的列名,列的數據類型。
求各部門總工資和平均工資
select * from (select salary, department_id from employee) 
pivot(sum(salary) sumsal, avg(salary) avgsal for(department_id) in (10,20,30));
10_sum  10_avg  20_sum 20_avg   30_sum  30_avg
370000	74000	155000	77500	370000	185000
相關文章
相關標籤/搜索