关于分组后字段拼接的问题
2008-02-23 07:36:02来源:互联网 阅读 ()
最近在论坛上,经常会看到关于分组后字段拼接的问题,大概是类似下列的情形:
SQL> select no,q from test 2 / NO Q 12 rows selected |
最后要得到类似于如下的结果:
001 n1;n2;n3;n4;n5 002 m1 003 t1;t2;t3;t4;t5;t6 |
通常大家都认为这类问题无法用一句SQL解决,本来我也这么认为,可是今天无意中突然有了灵感,原来是能够这么做的: NO Q RN RN1 12 rows selected
前几天有人提到过sys_connect_by_path的用法,我想这里是不是也能用到这个方法,假如能做到的话,不用函数或存贮过程也能够做到了;要用到sys_connect_by_path,首先要自己构建树型的结构,并且树的每个分支都是单根的,例如1-〉2-〉3-〉4,不会存在1-〉2,1-〉3的情况;
我是这么构建树,很简单的,看下面的结果就会知道了:
SQL> select no,q,rn,lead(rn) over(partition by no order by rn) rn1
2 from (select no,q,row_number() over(order by no,q desc) rn from test)
3 /
---------- ------------------------------ ---------- ----------
001 n5 1 2
001 n4 2 3
001 n3 3 4
001 n2 4 5
001 n1 5
002 m1 6
003 t6 7 8
003 t5 8 9
003 t4 9 10
003 t3 10 11
003 t2 11 12
003 t1 12
有了这个树型的结构,接下来的事就好办了,只要取出拥有全路径的那个path,问题就解决了,先看no=‘001’的分组: NO RESULT
select no,sys_connect_by_path(q,';') result from
(select no,q,rn,lead(rn) over(partition by no order by rn) rn1
from (select no,q,row_number() over(order by no,q desc) rn from test)
)
start with no = '001' and rn1 is null connect by rn1 = prior rn
SQL>
6 /
---------- --------------------------------------------------------------------------------
001 ;n1
001 ;n1;n2
001 ;n1;n2;n3
001 ;n1;n2;n3;n4
001 ;n1;n2;n3;n4;n5
上面结果的最后1条就是我们要得结果了,要得到每组的结果,能够下面这样
select no,max(sys_connect_by_path(q,';')) result
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 上一篇: SQL语句完成位操作 IDC资讯:
主机资讯
注册资讯
托管资讯
vps资讯
网站建设
网站运营:
建站经验
策划盈利
搜索优化
网站推广
免费资源
网络编程:
Asp.Net编程
Asp编程
Php编程
Xml编程
Access
Mssql
Mysql
其它
服务器技术:
Web服务器
Ftp服务器
Mail服务器
Dns服务器
安全防护
软件技巧:
其它软件
Word
Excel
Powerpoint
Ghost
Vista
QQ空间
QQ
FlashGet
迅雷
网页制作:
FrontPages
Dreamweaver
Javascript
css
photoshop
fireworks
Flash
from (select no,q,
(row_number() over(order by no,q desc)
dense_rank() over(order by no)) rn,
max(q) over(partition by no) qs
from test
)
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有