本文介绍两种行、列转换方法,一种是常规的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