Oracle行列转换

在工作中,我们有时候会需要将表的行列转换,来获取某些需求,下面我们便介绍一些表的行列转换的方法。
首先有一张课程成绩表
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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值