从Oracle 表格行列转置说起第1/2页

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 42 mon
2 -10 tue
2 50 thr
3 100 undefined

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

原因:

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

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

优点:

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

下一页 decode()函數使用技巧


1

(0)
上一篇 2022年3月22日
下一篇 2022年3月22日

相关推荐