例如表t1有如下数据:
name, hobby
a        足球
a        篮球
a        乒乓
b        游泳
b        足球
c        篮球如何用sql语句实现
结果如下:a|足球,篮球,乒乓
b|游泳,足球
c|篮球Oracle数据库格式化

解决方案 »

  1.   

    貌似只能用存储过程或者函数,简单的sql是不行的
    然后把过程或者函数嵌在sql中
      

  2.   


    sql有什么不可以的with t as
     (select 'a' name, '足球' hobby
        from dual
      union all
      select 'a' name, '篮球' hobby
        from dual
      union all
      select 'a' name, '乒乓' hobby
        from dual
      union all
      select 'b' name, '游泳' hobby
        from dual
      union all
      select 'b' name, '足球' hobby
        from dual
      union all
      select 'c' name, '篮球' hobby from dual)
    select t.name || '|' || listagg(hobby, ',') within group(order by t.name)
      from t
     group by t.name;
      

  3.   

    把上面的within group(order by t.name)
    改成
    within group(order by rownum)
    就ok了。
      

  4.   

    SQL> select id||'|'||wm_concat(nn) from test1 group by id;ID||'|'||WM_CONCAT(NN)
    ----------------------------------------------------------------
    a|足球,篮球,乒乓
    b|游泳,足球
    c|篮球
      

  5.   

    这个方法是可以的,但是有局限性,“足球,篮球,乒乓”的顺序是不固定的,用order by也没用,所以如果对顺序有要求的时候慎用
      

  6.   

    网上有很多类似的帖子。借用一下二楼数据:
    with t as (
    select 'a' name, '足球' hobby from dual union all  
    select 'a' name, '篮球' hobby from dual union all  
    select 'a' name, '乒乓' hobby from dual union all  
    select 'b' name, '游泳' hobby from dual union all  
    select 'b' name, '足球' hobby from dual union all  
    select 'c' name, '篮球' hobby from dual )
    select t.name||'|'|| wmsys.wm_concat(hobby)
    from t
    group by t.name
    /*
    a|足球,篮球,乒乓
    b|游泳,足球
    c|篮球
    */