广

oracle数据库

  • MYSQL
  • MSSQL
  • Redis
  • MongoDB
  • oracle数据库
  • 数据管理

    从Oracle 表格行列转置说起

    2018-05-04 21:21:17 次阅读 稿源:互联网
    广告
    全网推广平台,软文发布

    NOMONEYDAY
    1231
    1432
    1-453
    2421
    2-102
    2503
    31008

    为了符合阅读习惯,最终报表希望是如下格式:

    NOMONTUETHR
    12343-45
    242-1050
    3   

    ------------------------

    咱们一步步来实现:

    1.运用DECODE转换行为列

    SQL:

    SELECT NO,
        DECODE(DAY,1,MONEY,'') DAY1,
        DECODE(DAY,2,MONEY,'') DAY2,
        DECODE(DAY,3,MONEY,'') DAY3
    FROM TEMP

    结果:

    NODAY1DAY2DAY3
    123
    143
    1-45
    242
    2-10
    250
    3   

    2.按NO字段分组,并更改列名

    SQL:

    SELECT NO, MAX(DAY1) MON, MAX(DAY2) TUE, MAX(DAY3) THR
     FROM (SELECT NO,
            DECODE(DAY, 1, MONEY,'') DAY1,
            DECODE(DAY, 2, MONEY,'') DAY2,
            DECODE(DAY, 3, MONEY,'') DAY3
         FROM TEMP)
     GROUP BY NO;

    结果:

    NOMONTUETHR
    12343-45
    242-1050
    3   

    ------------------------

    重难点归纳:

    1.DECODE缺省值设置

    DECODE语法如下:decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)

    如果缺省值由''(两个单引号)改为0,即SQL:

    SELECT NO, MAX(DAY1) MON, MAX(DAY2) TUE, MAX(DAY3) THR
     FROM (SELECT NO,
            DECODE(DAY, 1, MONEY,0) DAY1,
            DECODE(DAY, 2, MONEY,0) DAY2,
            DECODE(DAY, 3, MONEY,0) DAY3
         FROM TEMP)
     GROUP BY NO;

    结果如下(所有值为负与空值都被赋为0):

    NOMONTUETHR
    123430
    242050
    3000

    2.列缺省值设置(DAY值为8的显示为'undefined')

    SQL:

    SELECT NO,MONEY,
        DECODE(DAY,1,'MON',2,'TUE',3,'THR','undefined') DAY
    FROM TEMP

    结果:

    NOMONEYDAY
    123MON
    143TUE
    1-45THR
    242MON
    2-10TUE
    250THR
    3100undefined

    3.行列转化在表单内数据量较大的情况下消耗较大

    原因:

    1.扫描目标数据时间开销大。

    2.GROUP BY时,数据冗余带来的多行合并。

    优点:

    表结构稳定:DAY增加新值只需增加记录,无需新增新列!

    下一页 decode()函使用技巧
    当前1/2页 12下一页

    一起学吧部分文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与一起学吧进行文章共享合作。

    广告
    广告
    广告
    广告