Oracle 11g Pivot函式實現列轉行
阿新 • • 發佈:2019-01-22
先上語法規範:
SELECT ....FROM PIVOT ( aggregate-function() FOR IN (, ,..., ) ) AS WHERE .....
通過一個例子說明其用法:
10_sum_sal 20_sum_sal 30_sum_sal
370000 155000 370000
在這個例子中,工資按照指定部門做聚集後,成為獨立的列顯示出來。有幾個部門,就有幾列;而總是隻有一行。即是說,達到了行轉列的效果。這種效果的報表在BI/DW應用中很常見。
注意:IN語句是必須的。也就是說,在執行SQL之前必須知道department_id
再進一步,按照多個列作行轉列
10_28 10_null 20_null
270000 100000 90000
這個SQL查詢按照指定部門和經理的組合聚合後的工資。相當於按照兩個維度來做聚集。
兩個pivot,這時列數增加1倍。但是for() in()內容需要保持一致,否則Oracle無法確定你的列名,列的資料型別。
求各部門總工資和平均工資
10_sum 10_avg 20_sum 20_avg 30_sum 30_avg
370000 74000 155000 77500 370000 185000
SELECT ....FROM PIVOT ( aggregate-function() FOR IN (, ,..., ) ) AS 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