表结构及数据
row\columns pk column1 column2
row1 100 A apple
row2 101 A bag
row3 102 A cat
row4 103 B dog
row5 104 B egg
想转化成
A apple,bag,cat
B dog,egg这样的形式,应该如何写sql啊

解决方案 »

  1.   

    with dm_gw as(
    select '100' pk , 'A ' column1 ,'apple' column2 from dual union all
    select '101' pk , 'A ' column1 ,'bag' column2 from dual union all
    select '102' pk , 'A ' column1 ,'cat' column2 from dual union all
    select '103' pk , 'B ' column1 ,'dog' column2 from dual union all
    select '104' pk , 'B ' column1 ,'egg' column2 from dual
    ) select column1, replace(wm_concat(to_char(column2)),',',',') as column2
    from dm_gw
     group by column1;
      

  2.   

    with a as
     (select 'row1' a,100 b,'a' c,'apple' d from dual
      union all
      select 'row2',101,'a','bag' from dual
     union all
      select 'row3',102,'a','cat' from dual
      union all
      select 'row4',103,'b','dog' from dual
      union all
     select 'row5',104,'b','egg' from dual
      )
    select c, replace(wm_concat(to_char(d)),'',',')   ds
    from a 
    group by c--结果
    a      apple,bag,cat
    b      dog,egg
      

  3.   

    数据库什么版本?
    10g或以上的,可以用楼上的wm_concat9i的话 decode函数拼接或存储过程处理
      

  4.   

    你这个是竖表打横表..可以参考一下下面的代码:
    交叉表
      主键:id+lx   
      select   *   from   tab_1;显示结果如下:   
          id           lx             sj   
      ---------------------   
            1           1类       03-01-01   
            1           2类       03-01-02   
            2           1类       03-02-01   
            2           2类       03-02-02   
            2           3类       03-02-03   
            3           2类       03-03-02   select   id,max(decode(lx,'1类',sj))   1类,   
                          max(decode(lx,'2类',sj))   2类,   
                          max(decode(lx,'3类',sj))   3类   
      from   tab_1       
      group   by   id;         id               1类             2类                 3类   
           -------------------------------------------   
              1           03-01-01         03-01-02   
              2           03-02-01         03-02-02            03-02-03   
              3                            03-03-02   
                                                ..........  
      

  5.   

    /*
    标题:合并相同列的数据
    作者:爱新觉罗.毓华 
    时间:2008-05-05
    地点:广东深圳
    *//*情况说明
    NAME USERID
    张三 KB001
    张三 KB003
    李四 KB001
    李四 KB002
    李四 KB003用SQL实现表示如下:
    NAME USERID
    张三 KB001,KB003
    李四 KB001,KB002,KB003
    */create table tb(NAME varchar2(10) , USERID varchar2(10))
    insert into tb values('张三' , 'KB001');
    insert into tb values('张三' , 'KB003');
    insert into tb values('李四' , 'KB001');
    insert into tb values('李四' , 'KB002');
    insert into tb values('李四' , 'KB003');--1
    select name,rtrim(
      max(decode(USERID , 'KB001' , USERID || ',' , '')) ||
      max(decode(USERID , 'KB002' , USERID || ',' , '')) ||
      max(decode(USERID , 'KB003' , USERID || ',' , '')),',') userid
    from tb
    group by name--2
    SELECT NAME, ltrim(MAX(sys_connect_by_path(userid , ',')) , ',') userid
    FROM (SELECT NAME , userid , row_number() over(PARTITION BY NAME ORDER BY userid) rn , rownum prn FROM tb)
    START WITH rn = 1
    CONNECT BY prn - 1 = PRIOR prn AND NAME = PRIOR NAME
    GROUP BY NAME
    ORDER BY NAME;drop table tb/*
    NAME       USERID                           
    ---------- ---------------------------------
    李四       KB001,KB002,KB003                
    张三       KB001,KB003                      
    2 rows selected
    */10g及以上可用WMSYS.WM_CONCAT.
      

  6.   

    oracle提供了行转列函数wm_concatselect col1, wm_concat(col2) from table group by col1
      

  7.   

    wm_concat 本身的连接分隔符就是逗号,不需要再加replce了。
    select c, wm_concat(to_char(d))   ds
    from a 
    group by c
      

  8.   


    select cloumn1, wm_concat(cloumn2)
    from table
    group by cloumn1
      

  9.   

    5楼的最通用,不受版本限制。
    但是wm_concat函数是最方便的。
      

  10.   

    8i以后版本可以参考如下写法
    SELECT t.col1 col1 , MAX(substr(sys_connect_by_path(t.col2, ','), 2)) str
      FROM (SELECT col1, col2, row_number() over(PARTITION BY col1 ORDER BY col2) rn
              FROM t_row_str) t
    START WITH rn = 1
    CONNECT BY rn = PRIOR rn + 1
           AND col1 = PRIOR col1 
    GROUP BY t.col1 ;
      

  11.   

    使用T-SQL行列相互转换命令:PIVOT和UNPIVOT
    一,使用PIVOT 实现数据表的列转行
    语法:
      SELECT  <未透视的列>,  [第一个透视列] AS <列别名>,  [第二个透视列] AS <列别名>,  ...  [最后一个透视列] AS <列别名>  FROM (  <SELECT查询>  ) AS <源表>  PIVOT (  <聚合函数>(<列>)  FOR [<需要转换为行的列>] IN (  [第一个透视列], [第二个透视列],  ...  [最后一个透视列]  )  ) AS <数据透视表>  <可选的ORDER BY子句>;  以上的PIVOT子句内的第1…n个透视列的值均为需要转换为行的列的常量值,需要用[]括起,支持GUID,字符串及各种数字!二,使用UNPIVOT 实现的功能其实与PIVOT恰恰相反
    语法:
    SELECT <未逆透视的列>, [合并后的列] AS <列别名>, [行值的列名] AS <列别名> FROM ( ) AS <源表> UNPIVOT ( <行值的列名> FOR <将原来多个列合并到单个列的列名> IN ( [第一个合并列], [第二个合并列], ... [最后一个合并列] ) ) AS <数据逆透视表> <可选的ORDER BY子句>;关于PIVOT和UNPIVOT命令的使用,如果想了解更多SQL的知识可以去看看这里的文章:http://database.51cto.com/sqlserver/,绝对不会让您失望的哦.