Oracle使用pivot和unpivot函數實現行列轉換
一、需求說明
項目開發(fā)過程中涉及到oracle數據庫的數據操作;但是需要將數據進行列的互轉,通過查閱資料可知在oracle中有三種方式可以實現行列互轉:
①使用decode 函數;
②使用case when 函數;
③使用pivot函數;
二、實現方法
我這里有一個數據表內容如下:
2.1、實現將上圖內容轉為行——decode函數
select "name", max(decode("course", '語文', "score")) 語文, max(decode("course", '數學', "score")) 數學, max(decode("course", '英語', "score")) 英語, sum("score") 總分 from "grade" group by "name";
2.2、實現將上圖內容轉為行——case when函數
select "name", max(case when "course" = '語文' then "score" end) 語文, max(case when "course" = '數學' then "score" end) 數學, max(case when "course" = '英語' then "score" end) 英語, sum("score") 總分 from "grade" group by "name";
2.3、實現將上圖內容轉為行——pivot函數
pivot函數的語法:
pivot(聚合函數 for 列名 in(類型))
select t.* from(
(select * from 原表名稱)
pivot(
max(需轉的列名稱)
for 需轉的列名稱 in(需轉列對應的值1,需轉列對應的值2,需轉列對應的值3
)
)t
SELECT t.*,(t.語文+t.數學+t.英語)總分 from ((SELECT "name","course","score" from "grade")pivot ( max("score") for "course" in('語文' 語文,'數學' 數學,'英語' 英語) ))t ORDER BY "name";
2.4、實現將上圖內容轉為列——unpivot函數
需要轉的內容如下圖:
unpivot函數的語法:
SELECT 列名稱,需定義的列1名稱,需定義的列2名稱 from 表名稱 unpivot (需定義的列2名稱 for 需定義的列1名稱 in(列2值1,列2值2,列2值3));
SELECT "name" 名字,course 課程,score 分數 from "grade2" unpivot (score for course in("chinese","math","english"));
SELECT 名字,course 課程,score 分數 from ( SELECT "name" 名字,"chinese" 語文,"math" 數學,"english" 英語 from "grade2") unpivot (score for course in(語文,數學,英語))
到此這篇關于Oracle使用pivot和unpivot函數實現行列轉換的文章就介紹到這了,更多相關Oracle行列轉換內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Windows Sever 2012下Oracle 12c安裝配置方法圖文教程
這篇文章主要為大家詳細介紹了Windows Sever 2012下Oracle 12c安裝配置方法圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04