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                                                        


你可能感兴趣的:(oracle,sql,行转列,休闲,无转行)