ITPub博客

首页 > 数据库 > Oracle > Oracle行列转换

Oracle行列转换

原创 Oracle 作者:西红柿炒番茄QAQ 时间:2016-12-30 16:24:11 0 删除 编辑
在工作中,我们有时候会需要将表的行列转换,来获取某些需求,下面我们便介绍一些表的行列转换的方法。
首先有一张课程成绩表
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博客 ” ,链接:https://blog.itpub.net/31386161/viewspace-2131673/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: Oracle分析函数
请登录后发表评论 登录
全部评论

注册时间:2016-08-19

  • 博文量
    51
  • 访问量
    109027