从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: SE...
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()函數使用技巧您可能感兴趣的文章:
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。