ORACLE 列轉行和行轉列的SQL和函數

本文介紹兩種行、列轉換方法,一種是常規的SQL,一種是ORACLE 11G提供的函數。下面使用一個小例子對這兩種方法進行說明。

---------------------------------原始表----------------------------------

SQL> select * from cj1;


NAME  KM            CJ                                                          

----- ----- ----------                                                          

張三  語文          80                                                          

張三  數學          86                                                          

張三  英語          75                                                          

李四  語文          78                                                          

李四  數學          85                                                          

李四  英語          79      


SQL> select * from cj2;


NAME       YUWEN     SHUXUE     YINGYU                                          

----- ---------- ---------- ----------                                          

張三          80         86         75                                          

李四          78         85         79                                                       


---------------------------------常規SQL----------------------------------

--行轉列

SQL> SELECT t.name,

  2         SUM(decode(t.km, '語文', t.cj, 0)) yuwen,

  3         SUM(decode(t.km, '數學', t.cj, 0)) shuxue,

  4         SUM(decode(t.km, '英語', t.cj, 0)) yingyu

  5    FROM cj1 t

  6   GROUP BY t.name;


NAME       YUWEN     SHUXUE     YINGYU                                          

----- ---------- ---------- ----------                                          

張三          80         86         75                                          

李四          78         85         79                                          

                                    

--列轉行

SQL> SELECT t.name, '語文' km, t.yuwen cj

  2    FROM cj2 t

  3  UNION

  4  SELECT t.name, '數學' km, t.shuxue cj

  5    FROM cj2 t

  6  UNION

  7  SELECT t.name, '英語' km, t.yingyu cj

  8    FROM cj2 t;


NAME  KM            CJ                                                          

----- ----- ----------                                                          

張三  數學          86                                                          

張三  英語          75                                                          

張三  語文          80                                                          

李四  數學          85                                                          

李四  英語          79                                                          

李四  語文          78                                                          


---------------------------------Oracle 11g新特性----------------------------------

--行轉列

SQL> SELECT *

  2    FROM cj1 t pivot(SUM(t.cj) FOR km IN('語文' yuwen,

  3                                         '數學' shuxue,

  4                                         '英語' yingyu));


NAME       YUWEN     SHUXUE     YINGYU                                          

----- ---------- ---------- ----------                                          

張三          80         86         75                                          

李四          78         85         79                                          


--列轉行

SQL> SELECT * FROM cj2 t unpivot(cj FOR km IN(yuwen , shuxue, yingyu));


NAME  KM              CJ                                                        

----- ------- ----------                                                        

張三  YUWEN           80                                                        

張三  SHUXUE          86                                                        

張三  YINGYU          75                                                        

李四  YUWEN           78                                                        

李四  SHUXUE          85                                                        

李四  YINGYU          79                                                        


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章