- 1、本文档共4页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Oracle中分组后拼接分组字符串
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?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?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*//*********************************?分析?*************************************/--简单解释一下那个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),根据No分区,取出当前行对应的下一条记录的行号字段:*/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()?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?nullconnect?by?rnNext?=?prior?rnFirst/*--这个大概意思就是从rnNext为null的那条记录开始,递归查找,--如果前一记录的rnFirst字段等于当前记录的rnNext字段,就把2条记录的Value用分号连接起来,--大家可以先试试下面这个没有Max和Group的Sql:*/select?No
文档评论(0)