本文介紹兩種行、列轉換方法,一種是常規的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