ORACLE行转列

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分组统计当月每天各种投诉原因的数量):

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JAVA小男子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值