有意思的行列转换
2010-02-21 00:22
183 查看
今天看见一个帖子是这样描述的
oracle中有一表tab
no name
1 a
2 b
3 c
4 d
你写一条sql语句显示以下结果
ab ac ad bc bd cd
答案:
create table test1(no number,name varchar2(20));
insert into values(1,'a');
......................
......................
思路是这样的
首先:这个肯定是自表连接的了
因为
1 a 2 b
1 a 3 c
1 a 4 d
2 b 3 c
2 b 4 d
3 c 4 d
t1.no < t2.no
现在可以做行列转换了
思路是根据 decode
从 res 集合中 取出A 列的数据 每次取一个然后把取出的值放入每一个decode()算一个值,最后都算完max()
取出ab 然后decode 后 t1 下就是 ab,t2下就是null,t3-t7都是null
取出ac 然后decode 后 t1 是null t2下是bc,t3-t7都是null
以此类推 最后每列都运行Max函数
oracle中有一表tab
no name
1 a
2 b
3 c
4 d
你写一条sql语句显示以下结果
ab ac ad bc bd cd
答案:
create table test1(no number,name varchar2(20));
insert into values(1,'a');
......................
......................
思路是这样的
首先:这个肯定是自表连接的了
因为
1 a 2 b
1 a 3 c
1 a 4 d
2 b 3 c
2 b 4 d
3 c 4 d
t1.no < t2.no
SQL> SQL> r 1 select t1.name || t2.name as a 2 from test1 t1,test1 t2 3 where 4* t1.no < t2.no A ---------------------------------------- ab ac ad bc bd cd
现在可以做行列转换了
思路是根据 decode
从 res 集合中 取出A 列的数据 每次取一个然后把取出的值放入每一个decode()算一个值,最后都算完max()
取出ab 然后decode 后 t1 下就是 ab,t2下就是null,t3-t7都是null
取出ac 然后decode 后 t1 是null t2下是bc,t3-t7都是null
以此类推 最后每列都运行Max函数
SQL> r 1 select decode(res.a,'ab',res.a,null) t1, 2 decode(res.a,'ac',res.a,null) t2, 3 decode(res.a,'ad',res.a,null) t3, 4 decode(res.a,'ae',res.a,null) t4, 5 decode(res.a,'bc',res.a,null) t5, 6 decode(res.a,'bd',res.a,null) t6, 7 decode(res.a,'cd',res.a,null) t7 8 from ( select t1.name || t2.name as a 9 from test1 t1,test1 t2 10 where 11 t1.no < t2.no 12* ) res T1 T2 T3 T4 T5 T6 T7 ----- ----- ----- ----- ----- ----- ----- ab null null null null null null null ac null null null null null null null ad null null null null null null null null bc null null null null null null null bd null null null null null null null cd 6 rows selected.
SQL> l 1 select max(decode(res.a,'ab',res.a,null)) || ' ' || 2 max(decode(res.a,'ac',res.a,null)) || ' ' || 3 max(decode(res.a,'ad',res.a,null)) || ' ' || 4 max(decode(res.a,'ae',res.a,null)) || ' ' || 5 max(decode(res.a,'bc',res.a,null)) || ' ' || 6 max(decode(res.a,'bd',res.a,null)) || ' ' || 7 max(decode(res.a,'cd',res.a,null)) as result 8 from ( select t1.name || t2.name as a 9 from test1 t1,test1 t2 10 where 11 t1.no < t2.no 12* ) res SQL> / RESULT ---------------------------------------------------------------------------------------------------- ab ac ad bc bd cd
相关文章推荐
- (转)Oracle中实现行列转换的方法
- sql 行列转换之关键字pivot,unpivot
- SQL Server中行列转换 Pivot UnPivot
- SQL Server中行列转换 Pivot UnPivot
- Oracle12C--行列转换(十五)
- Oracle12C--行列转换(十五)
- SQL行列转换[未使用临时表]
- 行列转换
- listagg 与 wm_concat行列转换
- Oracle行列转换小结
- 行列转换
- 瑞丽的SQL-SQL Server的表旋转(行列转换)
- SQL Server中行列转换 Pivot UnPivot
- MySQL逗号分割字段的行列转换技巧
- oracle 行列转换 pivot
- 【数据库】SQL经典面试题 - 行列转换二 - 列转行
- 数据库行列转换
- Oracle 行列转换 总结
- Oracle行列转换
- T-SQL行列相互转换命令:PIVOT和UNPIVOT使用详解