您的位置:首页 > 其它

有意思的行列转换

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

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: