Oracle中分组后拼接分组字符串

上传人:平*** 文档编号:13360698 上传时间:2017-10-23 格式:DOCX 页数:4 大小:15.85KB
返回 下载 相关 举报
Oracle中分组后拼接分组字符串_第1页
第1页 / 共4页
Oracle中分组后拼接分组字符串_第2页
第2页 / 共4页
Oracle中分组后拼接分组字符串_第3页
第3页 / 共4页
Oracle中分组后拼接分组字符串_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《Oracle中分组后拼接分组字符串》由会员分享,可在线阅读,更多相关《Oracle中分组后拼接分组字符串(4页珍藏版)》请在金锄头文库上搜索。

1、Oracle 中分组后拼接分组字符串先分组,再把分组后的属于某组的多条记录的某字段进行拼接。实现方式如下:/* -创建表 test*/create table test(NO NUMBER,VALUE VARCHAR2(100),NAME VARCHAR2(100);/* -插入数据*/insert into testselect * from(select 1,a,测试 1 from dual union allselect 1,b,测试 2 from dual union allselect 1,c,测试 3 from dual union allselect 1,d,测试 4 from

2、dual union allselect 2,e,测试 5 from dual union allselect 4,f,测试 6 from dual union allselect 4,g,测试 7 from dual);/*-Sql 语句:*/select No,ltrim(max(sys_connect_by_path(Value, ;), ;) as Value,ltrim(max(sys_connect_by_path(Name, ;), ;) as Namefrom (select No,Value,Name,rnFirst,lead(rnFirst) over(partition

3、by No order by rnFirst) rnNextfrom (select a.No,a.Value,a.Name,row_number() over(order by a.No, a.Value desc) rnFirstfrom Test a) tmpTable1) tmpTable2start with rnNext is nullconnect by rnNext = prior rnFirstgroup by No;/*-检索结果如下:*/*NO VALUE NAME1 a;b;c;d 测试 1;测试 2;测试 3;测试 42 e 测试 54 f;g 测试 6;测试 7*/

4、* 分析*/-简单解释一下那个 Sql 吧:/*-1、最内层的 Sql(即表 tmpTable1),按 No 和 Value 排序,并列出行号:*/select a.No,a.Value,a.Name,row_number() over(order by a.No, a.Value desc) rnFirstfrom Test a;/*该语句结果如下:NO VALUE NAME RNFIRST1 d 测试 4 11 c 测试 3 21 b 测试 2 31 a 测试 1 42 e 测试 5 54 g 测试 7 64 f 测试 6 7*/*-2、外层的 Sql(即表 tmpTable2),根据 N

5、o 分区,取出当前行对应的下一条记录的行号字段:*/select No,Value,Name,rnFirst,lead(rnFirst) over(partition by No order by rnFirst) rnNext/*-lead(rnFirst):取得下一行记录的 rnFirst 字段-over(partition by No order by rnFirst) 按 rnFirst 排序,并按 No 分区,-分区就是如果下一行的 No 字段与当前行的 No 字段不相等时,不取下一行记录显示*/from (select a.No,a.Value,a.Name,row_number(

6、) over(order by a.No, a.Value desc) rnFirstfrom Test a) tmpTable1;/*-该语句结果如下:NO VALUE NAME RNFIRST RNNEXT1 d 测试 4 1 21 c 测试 3 2 31 b 测试 2 3 41 a 测试 1 4 NULL2 e 测试 5 5 NULL4 g 测试 7 6 74 f 测试 6 7 NULL*/*-3、最后就是最外层的 sys_connect_by_path 函数与 start 递归了*/sys_connect_by_path(Value, ;)start with rnNext is nu

7、llconnect by rnNext = prior rnFirst/*-这个大概意思就是从 rnNext 为 null 的那条记录开始,递归查找,-如果前一记录的 rnFirst 字段等于当前记录的 rnNext 字段,就把 2 条记录的 Value 用分号连接起来,-大家可以先试试下面这个没有 Max 和 Group 的 Sql:*/select No,sys_connect_by_path(Value, ;) as Value,sys_connect_by_path(Name, ;) as Namefrom (select No,Value,Name,rnFirst,lead(rnFi

8、rst) over(partition by No order by rnFirst) rnNextfrom (select a.No,a.Value,a.Name,row_number() over(order by a.No, a.Value desc) rnFirstfrom Test a) tmpTable1) tmpTable2start with rnNext is nullconnect by rnNext = prior rnFirst/*结果是:NO VALUE NAME1 ;a ;测试 11 ;a;b ;测试 1;测试 21 ;a;b;c ;测试 1;测试 2;测试 31 ;a;b;c;d ;测试 1;测试 2;测试 3;测试 42 ;e ;测试 54 ;f ;测试 64 ;f;g ;测试 6;测试 7*/*-可以看到,每个 No 的最后一条记录就是我们要的了-所以在 sys_connect_by_path 外面套一个 Max,再加个 Group by No,得到的结果就是行转列的结果了-最后再加一个 Ltrim,去掉最前面的那个分号,完成。*/

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号