1. 程式人生 > >行轉列小結

行轉列小結

一、建立測試環境

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;

       結果: