在工作中,我们有时候会需要将表的行列转换,来获取某些需求,下面我们便介绍一些表的行列转换的方法。
首先有一张课程成绩表
SQL> select * from score;
ID NAME COURSE SCORE
---------- ---------- --------------- ----------
1 John Chinese 95
1 John Math 87
1 John English 88
1 John Sport 67
2 Jack Chinese 80
2 Jack Math 81
2 Jack English 59
2 Jack Sport 93
3 Mark Chinese 55
3 Mark Math 60
3 Mark Englisth 17
ID NAME COURSE SCORE
---------- ---------- --------------- ----------
3 Mark Sport 93
12 rows selected.
DECODE函数
SELECT ID,NAME,
SUM(DECODE(course,'Chinese',score,0)) Chinese,
SUM(DECODE(course,'Math',score,0)) Math,
SUM(DECODE(course,'English',score,0)) English,
SUM(DECODE(course,'Sport',score,0)) Sport
FROM score
GROUP BY ID ,NAME; 2 3 4 5 6 7
ID NAME CHINESE MATH ENGLISH SPORT
---------- ---------- ---------- ---------- ---------- ----------
2 Jack 80 81 59 93
1 John 95 87 88 67
3 Mark 55 60 17 93
注:这里的SUM函数可以被MAX,MIN函数代替
CASE WHEN方法
SQL> SELECT ID,NAME,
SUM(CASE WHEN course='Chinese' THEN score ELSE 0 END) Chinese,
SUM(CASE WHEN course='Math' THEN score ELSE 0 END) Math,
SUM(CASE WHEN course='English' THEN score ELSE 0 END) English,
SUM(CASE WHEN course='Sport' THEN score ELSE 0 END) Sprot
FROM score
GROUP BY ID ,NAME;
ID NAME CHINESE MATH ENGLISH SPROT
---------- --------------- ---------- ---------- ---------- ----------
2 Jack 80 81 59 93
1 John 95 87 88 67
3 Mark 55 60 17 93
因为CASE WHEN和DECODE函数在很多情况下都可以相互转换,所以此处也可以使用CASE WHEN方法。
因此此处的SUM聚合函数,也理所当然地可以换成MAX或者MIN。
wmsys.wm_concat函数
SQL> SELECT ID,NAME,
wmsys.wm_concat(course || ':'||score) score
FROM score
GROUP BY ID ,NAME;
ID NAME SCORE
---------- --------------- --------------------------------------------------
1 John Chinese:95,Sport:67,English:88,Math:87
2 Jack Chinese:80,Sport:93,English:59,Math:81
3 Mark Chinese:55,Sport:93,English:17,Math:60
这里是直接使用
wmsys.wm_concat函数,把course和score这两列连接在一起使用了。虽然达到了想要的结果。但严格来说并不算行列转换把,倒像是将
多列合并转换成字符串。
好了,行列转换就先介绍这么多,其实还有一些其他的行列转换的方式,这几个算是比较基础的方法。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31386161/viewspace-2131673/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/31386161/viewspace-2131673/