当前位置 博文首页 > java_bird:ORACLE行转列

    java_bird:ORACLE行转列

    作者:[db:作者] 时间:2021-09-03 21:39

    ORACLE行转列

    Oracle行转列用到decode函数,decode函数说明如下:

    decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)

    decode(字段比较1,翻译值1,比较2,翻译值2,...比较n,翻译值n,缺省值)

    该函数含义如下:

    if ? ?条件==值1 ? ?then

    return(翻译值1)

    elsif ? ?条件==值2 ? ?then

    return(翻译值2

    ...

    else

    return(缺省值)

    end if

    例子:select decode(sign(变量1-变量2),-1,变量1,变量2) from dual;--取较小的值

    再此说明一下sign(n)函数:

    该函数取数字n的符号,如果n大于0返回1,等于0返回0,小于0返回-1.

    以下为工作中遇到的需要进行行转列显示数据的经历:

    用户投诉表结构如下:

    -- Create table
    create table CMP_TOUSU
    (
    ?id ? ? INTEGER not null,
    ?cpid ? INTEGER,
    ?cpname VARCHAR2(30),
    ?dtime ?VARCHAR2(50),
    ?r1 ? ? INTEGER default 0,
    ?r2 ? ? INTEGER default 0,
    ?r3 ? ? INTEGER default 0,
    ?r4 ? ? INTEGER default 0
    )
    tablespace USERS
    ?pctfree 10
    ?initrans 1
    ?maxtrans 255
    ?storage
    ?(
    ? ?initial 64
    ? ?next 1
    ? ?minextents 1
    ? ?maxextents unlimited
    ?);
    -- Add comments to the columns?
    comment on column CMP_TOUSU.dtime
    ?is '投诉时间';
    comment on column CMP_TOUSU.r1
    ?is '全部投诉';
    comment on column CMP_TOUSU.r2
    ?is '否认定制投诉';
    comment on column CMP_TOUSU.r3
    ?is '定制争议投诉';
    comment on column CMP_TOUSU.r4
    ?is '商品未到账投诉';
    -- Create/Recreate primary, unique and foreign key constraints?
    alter table CMP_TOUSU
    ?add constraint PK_CMP_TOUSU primary key (ID)
    ?using index?
    ?tablespace USERS
    ?pctfree 10
    ?initrans 2
    ?maxtrans 255
    ?storage
    ?(
    ? ?initial 64K
    ? ?next 1M
    ? ?minextents 1
    ? ?maxextents unlimited
    ?);

    执行如下sql语句:select * from cmp_tousu where dtime between '2014-10-01' and '2014-10-31';

    结果如下所示:

    执行sql语句:select cpname,sum(decode(dtime,'2014-10-01',r1,0)) day1,sum(decode(dtime,'2014-10-02',r1,0)) day2,sum(decode(dtime,'2014-10-03',r1,0)) day3,
    sum(decode(dtime,'2014-10-04',r1,0)) day4,sum(decode(dtime,'2014-10-05',r1,0)) day5,sum(decode(dtime,'2014-10-06',r1,0)) day6,sum(decode(dtime,'2014-10-07',r1,0)) day7,
    sum(decode(dtime,'2014-10-08',r1,0)) day8,sum(decode(dtime,'2014-10-09',r1,0)) day9,sum(decode(dtime,'2014-10-10',r1,0)) day10,sum(decode(dtime,'2014-10-011',r1,0)) day11,
    sum(decode(dtime,'2014-10-12',r1,0)) day12,sum(decode(dtime,'2014-10-13',r1,0)) day13,sum(decode(dtime,'2014-10-14',r1,0)) day14,sum(decode(dtime,'2014-10-15',r1,0)) day15,
    sum(decode(dtime,'2014-10-16',r1,0)) day16,sum(decode(dtime,'2014-10-17',r1,0)) day17,sum(decode(dtime,'2014-10-18',r1,0)) day18,sum(decode(dtime,'2014-10-19',r1,0)) day19,
    sum(decode(dtime,'2014-10-20',r1,0)) day20,sum(decode(dtime,'2014-10-21',r1,0)) day21,sum(decode(dtime,'2014-10-22',r1,0)) day22,sum(decode(dtime,'2014-10-23',r1,0)) day23,
    sum(decode(dtime,'2014-10-24',r1,0)) day24,sum(decode(dtime,'2014-10-25',r1,0)) day25,sum(decode(dtime,'2014-10-26',r1,0)) day26,sum(decode(dtime,'2014-10-27',r1,0)) day27,
    sum(decode(dtime,'2014-10-28',r1,0)) day28,sum(decode(dtime,'2014-10-29',r1,0)) day29,sum(decode(dtime,'2014-10-30',r1,0)) day30,sum(decode(dtime,'2014-10-31',r1,0)) day31
    from cmp_tousu where dtime between '2014-10-01' and '2014-10-31' group by cpname?

    行转列效果如下图所示(按cpname分组统计当月每天各种投诉原因的数量):

    cs
    下一篇:没有了