Oracle中實(shí)現(xiàn)行列互轉(zhuǎn)的方法分享
一、使用Case when 實(shí)現(xiàn)列轉(zhuǎn)為行(多行一列-->一行多列)
1.1、實(shí)現(xiàn)效果
①原表效果

②實(shí)現(xiàn)將Course課程列內(nèi)容轉(zhuǎn)為行效果【實(shí)現(xiàn)將每個(gè)人員的課程信息合成一行,且獲取到課程總分】

1.2、列轉(zhuǎn)行(多行一列-->一行多列)
sql語(yǔ)句
SELECT NAME,
MAX(CASE WHEN COURSE='語(yǔ)文' THEN SCORE END) "語(yǔ)文",
MAX(CASE WHEN COURSE='數(shù)學(xué)' THEN SCORE END) "數(shù)學(xué)",
MAX(CASE WHEN COURSE='英語(yǔ)' THEN SCORE END) "英語(yǔ)",
MAX(CASE WHEN COURSE='物理' THEN SCORE END) "物理",
SUM(SCORE) "總分"
FROM stu GROUP BY NAME;二、使用 Case When 實(shí)現(xiàn)行轉(zhuǎn)列(一行多列-->多行一列)
2.1、實(shí)現(xiàn)效果
①原表效果

②實(shí)現(xiàn)將多個(gè)數(shù)字列轉(zhuǎn)為一列效果

2.2、行轉(zhuǎn)列(一行多列-->多行一列)
sql語(yǔ)句
SELECT NAME, CASE WHEN LV = 1 THEN '語(yǔ)文' --常量 WHEN LV = 2 THEN '數(shù)學(xué)' --常量 WHEN LV = 3 THEN '英語(yǔ)' --常量 WHEN LV = 4 THEN '物理' --常量 END 科目, CASE WHEN LV = 1 THEN langu --列名 WHEN LV = 2 THEN math--列名 WHEN LV = 3 THEN english--列名 WHEN LV = 4 THEN pycial--列名 END 成績(jī) FROM ( SELECT * FROM course, (SELECT LEVEL LV FROM DUAL CONNECT BY LEVEL <= 4) ) --成績(jī)對(duì)應(yīng)的列數(shù) ORDER BY 1, 2;
三、將結(jié)果集轉(zhuǎn)為一行
①查詢到每個(gè)部門的人數(shù)
--查詢每個(gè)部門的人數(shù) SELECT DEPTNO, COUNT(1) CN FROM EMP GROUP BY DEPTNO ORDER BY 1;

②將查詢到的每個(gè)部門人數(shù)的結(jié)果集【轉(zhuǎn)為一行】
--將上面的結(jié)果轉(zhuǎn)為一行,可以使用 SUM 或者 COUNT 來求出。
SELECT SUM(CASE WHEN DEPTNO = 10 THEN 1 END) D_10,
SUM(CASE WHEN DEPTNO = 20 THEN 1 END) D_20,
SUM(CASE WHEN DEPTNO = 30 THEN 1 END) D_30
FROM EMP;
--也可以使用下面的方法。
SELECT CASE WHEN DEPTNO = 10 THEN CN END D_10,
CASE WHEN DEPTNO = 20 THEN CN END D_20,
CASE WHEN DEPTNO = 30 THEN CN END D_30
FROM (SELECT DEPTNO, COUNT(1) CN FROM EMP GROUP BY DEPTNO);
--和剛講的一樣,生成了三行三列數(shù)據(jù),使用 MAX 來獲取。
SELECT MAX(CASE WHEN DEPTNO = 10 THEN CN END) D_10,
MAX(CASE WHEN DEPTNO = 20 THEN CN END) D_20,
MAX(CASE WHEN DEPTNO = 30 THEN CN END) D_30
FROM (SELECT DEPTNO, COUNT(1) CN FROM EMP GROUP BY DEPTNO);四、將結(jié)果集轉(zhuǎn)為多行

SELECT MAX(CASE JOB WHEN 'CLERK' THEN ENAME END) CLERK,
MAX(CASE JOB WHEN 'ANALYST' THEN ENAME END) ANALYST,
MAX(CASE JOB WHEN 'MANAGER' THEN ENAME END) MANAGER,
MAX(CASE JOB WHEN 'PRESIDENT' THEN ENAME END) PRESIDENT,
MAX(CASE JOB WHEN 'SALESMAN' THEN ENAME END) SALESMAN
FROM (SELECT ENAME,
JOB,
--每組都是從 1 開始排序,而每列里面只有一組有數(shù)據(jù)。也就是 RN 相同的在每列里面只有一條數(shù)據(jù)
ROW_NUMBER() OVER(PARTITION BY JOB ORDER BY ENAME) RN
FROM EMP)
GROUP BY RN
ORDER BY RN;到此這篇關(guān)于Oracle中實(shí)現(xiàn)行列互轉(zhuǎn)的方法分享的文章就介紹到這了,更多相關(guān)Oracle行列互轉(zhuǎn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
oracle復(fù)制表結(jié)構(gòu)和復(fù)制表數(shù)據(jù)語(yǔ)句分享
這篇文章主要介紹了oracle復(fù)制表結(jié)構(gòu)和復(fù)制表數(shù)據(jù)的語(yǔ)句,大家直接使用就可以了2014-03-03
Oracle數(shù)據(jù)庫(kù)的備份及恢復(fù)策略研究
Oracle數(shù)據(jù)庫(kù)的備份及恢復(fù)策略研究...2007-03-03
windows使用sqlpus連接oracle 數(shù)據(jù)庫(kù)的教程圖解
這篇文章主要介紹了windows使用sqlpus連接oracle 數(shù)據(jù)庫(kù)的教程圖解,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08
expdp與impdp導(dǎo)出導(dǎo)入特定表方式
文章介紹了在Oracle數(shù)據(jù)庫(kù)中導(dǎo)入導(dǎo)出特定表的方法,包括在10g和11g/12c中的操作區(qū)別,以及如何使用DBBAK文件夾作為導(dǎo)出文件的存儲(chǔ),同時(shí),文章指出了在Windows Server 2012及以上版本中使用PowerShell時(shí)可能會(huì)遇到的問題,建議在DOS命令行窗口中執(zhí)行相關(guān)操作2025-01-01
Oracle SYS用戶無法登錄數(shù)據(jù)庫(kù)ORA-12162的解決方法
文章解析Oracle SYSDBA用戶OS登錄錯(cuò)誤(ORA-12162)原因及解決方法,指出未設(shè)置ORACLE_HOME和ORACLE_SID環(huán)境變量導(dǎo)致系統(tǒng)無法識(shí)別實(shí)例,進(jìn)而無法連接數(shù)據(jù)庫(kù),同時(shí)介紹了SYS用戶權(quán)限、數(shù)據(jù)字典管理及兩種登錄認(rèn)證方式(操作系統(tǒng)認(rèn)證和數(shù)據(jù)庫(kù)認(rèn)證)2025-08-08

