行轉列小結
一、建立測試環境
1.建立測試資料
create table cc ( student nvarchar2(2), course nvarchar2(2), score int );
2.插入測試資料
Insert into CC (STUDENT,COURSE,SCORE) values ('張三','語文',78); Insert into CC (STUDENT,COURSE,SCORE) values ('張三','數學',87); Insert into CC (STUDENT,COURSE,SCORE) values ('張三','英語',82); Insert into CC (STUDENT,COURSE,SCORE) values ('張三','物理',90); Insert into CC (STUDENT,COURSE,SCORE) values ('李四','語文',65); Insert into CC (STUDENT,COURSE,SCORE) values ('李四','數學',77); Insert into CC (STUDENT,COURSE,SCORE) values ('李四','英語',65); Insert into CC (STUDENT,COURSE,SCORE) values ('李四','物理',85); Insert into CC (STUDENT,COURSE,SCORE) values ('王五','語文',80); Insert into CC (STUDENT,COURSE,SCORE) values ('王五','數學',90); Insert into CC (STUDENT,COURSE,SCORE) values ('王五','英語',75); Insert into CC (STUDENT,COURSE,SCORE) values ('王五','物理',91); Insert into CC (STUDENT,COURSE,SCORE) values ('趙六','語文',93); Insert into CC (STUDENT,COURSE,SCORE) values ('趙六','數學',76); Insert into CC (STUDENT,COURSE,SCORE) values ('趙六','英語',86); Insert into CC (STUDENT,COURSE,SCORE) values ('趙六','物理',77);
3.顯示結果
二、行轉列實現方法
1.使用vm_concat、pivot、decode函式實現
1) vm_concat:將滿足條件的列值顯示成一行。
缺點:顯示結果順序錯亂,只支援10g及以上版本。
舉 例:
SELECT STUDENT,WM_CONCAT(SCORE)FROM CC GROUP BY STUDENT;
顯示結果:
改 進:
select student,max(score) from (select student,wm_concat(score) over(partition by student order by score) as score from cc) group by student;
顯示結果:
2)pivot:對滿足條件的A、B兩列進行如下操作,將A列中指定的值生成為列名,將與之對應的B值生成為(新)列值。
缺點:只支援11g及以上版本。
舉例:select * from cc PIVOT(max(score) FOR COURSE IN ('語文' AS 語文, '數學' AS 數學,'英語' as 英語 ,'物理' as 物理 ));
結果:
3)decode:判斷字串是否一樣;
格式:DECODE(value,if1,then1,if2,then2,if3,then3,...,else)
舉例:
SELECT student, MAX(DECODE(COURSE, '語文', SCORE)) as 語文, MAX(DECODE(COURSE, '數學', SCORE)) as 數學, MAX(DECODE(COURSE, '英語', SCORE)) as 英語, MAX(DECODE(COURSE, '物理', SCORE)) as 物理 FROM CC GROUP BY student;
結果: