从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()函數使用技巧上一篇: sql中设置联合主键的具体方法
下一篇: SQL 查询和删除重复字段数据的方法