Oracle使用pivot和unpivot函數(shù)實(shí)現(xiàn)行列轉(zhuǎn)換
一、需求說明
項(xiàng)目開發(fā)過程中涉及到oracle數(shù)據(jù)庫的數(shù)據(jù)操作;但是需要將數(shù)據(jù)進(jìn)行列的互轉(zhuǎn),通過查閱資料可知在oracle中有三種方式可以實(shí)現(xiàn)行列互轉(zhuǎn):
①使用decode 函數(shù);
②使用case when 函數(shù);
③使用pivot函數(shù);
參考:Oracle中實(shí)現(xiàn)行列互轉(zhuǎn)的方法分享
二、實(shí)現(xiàn)方法
我這里有一個(gè)數(shù)據(jù)表內(nèi)容如下:
2.1、實(shí)現(xiàn)將上圖內(nèi)容轉(zhuǎn)為行——decode函數(shù)
select "name", max(decode("course", '語文', "score")) 語文, max(decode("course", '數(shù)學(xué)', "score")) 數(shù)學(xué), max(decode("course", '英語', "score")) 英語, sum("score") 總分 from "grade" group by "name";
2.2、實(shí)現(xiàn)將上圖內(nèi)容轉(zhuǎn)為行——case when函數(shù)
select "name", max(case when "course" = '語文' then "score" end) 語文, max(case when "course" = '數(shù)學(xué)' then "score" end) 數(shù)學(xué), max(case when "course" = '英語' then "score" end) 英語, sum("score") 總分 from "grade" group by "name";
2.3、實(shí)現(xiàn)將上圖內(nèi)容轉(zhuǎn)為行——pivot函數(shù)
pivot函數(shù)的語法:
pivot(聚合函數(shù) for 列名 in(類型))
select t.* from(
(select * from 原表名稱)
pivot(
max(需轉(zhuǎn)的列名稱)
for 需轉(zhuǎn)的列名稱 in(需轉(zhuǎn)列對應(yīng)的值1,需轉(zhuǎn)列對應(yīng)的值2,需轉(zhuǎn)列對應(yīng)的值3
)
)t
SELECT t.*,(t.語文+t.數(shù)學(xué)+t.英語)總分 from ((SELECT "name","course","score" from "grade")pivot ( max("score") for "course" in('語文' 語文,'數(shù)學(xué)' 數(shù)學(xué),'英語' 英語) ))t ORDER BY "name";
2.4、實(shí)現(xiàn)將上圖內(nèi)容轉(zhuǎn)為列——unpivot函數(shù)
需要轉(zhuǎn)的內(nèi)容如下圖:
unpivot函數(shù)的語法:
SELECT 列名稱,需定義的列1名稱,需定義的列2名稱 from 表名稱 unpivot (需定義的列2名稱 for 需定義的列1名稱 in(列2值1,列2值2,列2值3));
SELECT "name" 名字,course 課程,score 分?jǐn)?shù) from "grade2" unpivot (score for course in("chinese","math","english"));
SELECT 名字,course 課程,score 分?jǐn)?shù) from ( SELECT "name" 名字,"chinese" 語文,"math" 數(shù)學(xué),"english" 英語 from "grade2") unpivot (score for course in(語文,數(shù)學(xué),英語))
到此這篇關(guān)于Oracle使用pivot和unpivot函數(shù)實(shí)現(xiàn)行列轉(zhuǎn)換的文章就介紹到這了,更多相關(guān)Oracle行列轉(zhuǎn)換內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
oracle中fdisk導(dǎo)致的ASM磁盤數(shù)據(jù)丟失的解決方法
oracle中fdisk 導(dǎo)致的ASM磁盤數(shù)據(jù)丟失 有需要的朋友可參考一下2012-10-10整理Oracle數(shù)據(jù)庫中數(shù)據(jù)查詢優(yōu)化的一些關(guān)鍵點(diǎn)
這篇文章主要介紹了Oracle數(shù)據(jù)庫中數(shù)據(jù)查詢優(yōu)化的一些關(guān)鍵點(diǎn)的整理,包括多表和大表查詢等情況的四個(gè)方面的講解,需要的朋友可以參考下2016-01-01Windows Sever 2012下Oracle 12c安裝配置方法圖文教程
這篇文章主要為大家詳細(xì)介紹了Windows Sever 2012下Oracle 12c安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04Oracle數(shù)據(jù)庫產(chǎn)重啟服務(wù)和監(jiān)聽程序命令介紹
大家好,本篇文章主要講的是Oracle數(shù)據(jù)庫產(chǎn)重啟服務(wù)和監(jiān)聽程序命令介紹,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12Oracle解鎖表、包、用戶、殺會話、停job的方法實(shí)現(xiàn)
本文主要介紹了Oracle解鎖表、包、用戶、殺會話、停job的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-12-12Oracle 中 table 函數(shù)的應(yīng)用淺析
表函數(shù)可接受查詢語句或游標(biāo)作為輸入?yún)?shù),并可輸出多行數(shù)據(jù)。這篇文章主要介紹了Oracle 中 table 函數(shù)的應(yīng)用淺析,需要的朋友可以參考下2016-12-12