oracle整张表转置,从Oracle表格行列转置说起...

从Oracle表格行列转置说起...

当你面对如下格式的一个表格:NO为人员的ID,MONEY是收入,DAY是星期(1代表星期一,7代表周日)。

NO

MONEY

DAY

1

23

1

1

43

2

1

-45

3

2

42

1

2

-10

2

2

50

3

3

100

8

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

NO

MON

TUE

THR

1

23

43

-45

2

42

-10

50

3

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

咱们一步步来实现:

1.运用DECODE转换行为列

SQL:

SELECT NO,

DECODE(DAY,1,MONEY,'') DAY1,

DECODE(DAY,2,MONEY,'') DAY2,

DECODE(DAY,3,MONEY,'') DAY3

from TEMP

结果:

NO

DAY1

DAY2

DAY3

1

23

1

43

1

-45

2

42

2

-10

2

50

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;

结果:

NO

MON

TUE

THR

1

23

43

-45

2

42

-10

50

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):

NO

MON

TUE

THR

1

23

43

0

2

42

0

50

3

0

0

0

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

SQL:

SELECT NO,MONEY,

DECODE(DAY,1,'MON',2,'TUE',3,'THR','undefined') DAY

from TEMP

结果:

NO

MONEY

DAY

1

23

MON

1

43

TUE

1

-45

THR

2

相关文档:

本系列文章导航

[Oracle]高效的PL/SQL程序设计(一)--伪列ROWNUM使用技巧

[Oracle]高效的PL/SQL程序设计(二)--标量子查询

[Oracle]高效的PL/SQL程序设计(三)--Package的优点

[Oracle]高效的PL/SQL程序设计(四)--批量处理

[Oracle]高效的PL/SQL程序设计(五)--调用存储过程返回结果集

[Oracle]高效的PL/SQL程序设计(六)- ......

本系列文章导航

[Oracle]高效的PL/SQL程序设计(一)--伪列ROWNUM使用技巧

[Oracle]高效的PL/SQL程序设计(二)--标量子查询

[Oracle]高效的PL/SQL程序设计(三)--Package的优点

[Oracle]高效的PL/SQL程序设计(四)--批量处理

[Oracle]高效的PL/SQL程序设计(五)--调用存储过程返回结果集

[Oracle]高效的PL/SQL程序设计(六)- ......

本系列文章导航

[Oracle]高效的PL/SQL程序设计(一)--伪列ROWNUM使用技巧

[Oracle]高效的PL/SQL程序设计(二)--标量子查询

[Oracle]高效的PL/SQL程序设计(三)--Package的优点

[Oracle]高效的PL/SQL程序设计(四)--批量处理

[Oracle]高效的PL/SQL程序设计(五)--调用存储过程返回结果集

[Oracle]高效的PL/SQL程序设计(六)- ......

'-------------------------------------------------------------------以下是登录代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值