Chinaunix首页 | 论坛 | 博客
  • 博客访问: 535143
  • 博文数量: 63
  • 博客积分: 1194
  • 博客等级: 中士
  • 技术积分: 761
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-24 12:44
个人简介

得之坦然,失之淡然,争其必然,顺其自然!

文章分类

全部博文(63)

文章存档

2014年(2)

2013年(22)

2012年(39)

分类: Oracle

2012-11-16 16:40:16

wm_concat在行转列的时候非常有用,但在行转列的过程中的排序问题常常难以控制。

可见下面例子:
准备测试表:
drop table t;
create table t (n number,m number);
insert into t values(1,1);
insert into t values(5,3);
insert into t values(3,3);
insert into t values(6,5);
insert into t values(7,2);
insert into t values(2,2);
insert into t values(0,1);
insert into t values(11,1);
insert into t values(15,3);
insert into t values(13,3);
insert into t values(16,5);
insert into t values(17,2);
insert into t values(12,2);
insert into t values(10,1);
commit;

SQL> select * from t order by 2,1;

N M
———- ———-
0 1
1 1
10 1
11 1
2 2
7 2
12 2
17 2
3 3
5 3
13 3
15 3
6 5
16 5

测试wm_concat后的顺序:
测试1:
SQL> select m,wm_concat(n) from t group by m;

M WM_CONCAT(N)
———- ——————————————————————————–
11,0,1,10
17,2,7,12
15,3,5,13
16,6

可见wm_concat后的顺序并没有按大->小,或小->大的顺序。

测试2:
–参考网上一些解决思路
SQL> select m,wm_concat(n)
2 from (select n,m from t order by m,n )
3 group by m;

M WM_CONCAT(N)
———- ——————————————————————————–
0,11,10,1
2,17,12,7
3,15,13,5
6,16

可见顺序问题还是没有解决

最终解决思路:
SQL> select m, max(r)
2 from (select m, wm_concat(n) over (partition by m order by n) r from t)
3 group by m ;

M MAX(R)
———- ——————————————————————————–
0,1,10,11
2,7,12,17
3 3,5,13,15
6,16

阅读(3752) | 评论(0) | 转发(0) |
0

上一篇:Oracle SCN详解

下一篇:mysql 导出存储过程

给主人留下些什么吧!~~