create table temp01 

a varchar(20), 
b varchar(20) 
) ;
insert into temp01 values ('aa','12||1') ;
insert into temp01 values ('aa','13||4'); 
insert into temp01 values ('aa','3||66'); 
insert into temp01 values ('aa','4234||88'); 
insert into temp01 values ('aa','30||33') ;需要得到结果:
12||1,13||4,3||66,4234||88,30||33
只用简单查询怎么可以做到?谢谢

解决方案 »

  1.   

    找到方法了,用listagg函数,汗~select listagg(b,',') within GROUP (order by a) from test group by a;
      

  2.   

    以前用WMSYS.WM_CONCAT
    11g吧开始用listagg话说这个listagg() 后面within group()好像是固定写法,干嘛搞这么多关键字还不能缺省,不知道是怎么设计的
      

  3.   

    12C WMSYS.WM_CONCAT这个都不支持了
      

  4.   


    从字面就可以理解,这个是组内的顺序。拼接字符串和汇总数字不一样,汇总数值时,先加谁后加谁对结果没有影响,但是拼接字符串,要指定谁在前,谁在后;是啊,这个语法拼接的顺序必须指定,就我而言,接触这个函数时有点别扭的感觉
    1、listagg 这名字有点不直观啊,可能是我英语不好
    2、within group(order by XXX)的必须固定语法有点长啊,本身也是个分析函数可与over配合用,限制over中order by必须不就得了
    3、为什么要必须指定order by呢,如果现实业务并不要求顺序干嘛多此一举呢,像WM_CONCAT一样不就挺好么,毕竟排序的性能代价挺高的
      

  5.   


    从字面就可以理解,这个是组内的顺序。拼接字符串和汇总数字不一样,汇总数值时,先加谁后加谁对结果没有影响,但是拼接字符串,要指定谁在前,谁在后;是啊,这个语法拼接的顺序必须指定,就我而言,接触这个函数时有点别扭的感觉
    1、listagg 这名字有点不直观啊,可能是我英语不好
    2、within group(order by XXX)的必须固定语法有点长啊,本身也是个分析函数可与over配合用,限制over中order by必须不就得了
    3、为什么要必须指定order by呢,如果现实业务并不要求顺序干嘛多此一举呢,像WM_CONCAT一样不就挺好么,毕竟排序的性能代价挺高的4、而且,他还不支持distinct,你都排序了去重复还很困难吗。。?
      

  6.   

    名字没有问题, List  Aggregate  的简写;用 over 中来限制  oder by ,这个不合标准,可以看看官方文档,有对这个的具体的解释;12c 开始不支持  wm_concat 了,其实 oracle 官网也从来没有承认过这个函数,如果业务有要求,让实现排序用 wm_concat 的性能也不乐观,语句更加臃肿。
      

  7.   


    wm_concat 的性能的确非常不好,反正也没了,
    用人家的产品就得遵循人家的标准啊,嗯嗯