| 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增加新值只需增加记录,无需新增新列!
- Oracle实现行列转换的方法分析
- Oracle的数据表中行转列与列转行的操作实例讲解
- Oracle 数据库针对表主键列并发导致行级锁简单演示
- oracle wm_concat 列转行 逗号分隔
- Oracle逗号分隔列转行实现方法
- Oracle CBO几种基本的查询转换详解
- oracle中to_date详细用法示例(oracle日期格式转换)
- 通过创建SQLServer 2005到 Oracle10g 的链接服务器实现异构数据库数据转换方案
- MySQL转换Oracle的需要注意的七个事项
- 将mysql转换到oracle必须了解的50件事
- ORACLE常用数值函数、转换函数、字符串函数
- Oracle实现行转换成列的方法

评论(0)