有如下数据:
menu_id   pgm_id    cname      role_id
M0000  |  pvi08  |  test_1  |  Z2
M0000  |  pvi08  |  test_1  |  Z3
M0000  |  pvi08  |  test_1  |  Z31
M0000  |  pvi08  |  test_1  |  Z6
M0000  |  pvi08  |  test_1  |  Z7
M0000  |  fc018  |  test_2  |  Z00Z
M0000  |  fc018  |  test_2  |  Z3211我想要得到以下结果:
M0000 pvi08 test_1 Z2 Z3 Z31 Z6 Z7
M0000 fc018 test_2 Z00Z Z3211通过自己建的存储过程失败,求方法!!!

解决方案 »

  1.   

    M0000 | pvi08 | test_1 | Z2 Z3 Z31 Z6 Z7 
    M0000 | fc018 | test_2 | Z00Z Z3211 
    这样的话,不是行列转换,而是字段连接(可用两种方法)如果最后那列也要分多个字段,就如楼上所说的,可能还要动态建表
      

  2.   

    http://blog.csdn.net/you_tube/archive/2009/04/08/4058291.aspx
      

  3.   

    http://blog.csdn.net/you_tube/archive/2009/04/09/4059251.aspx
      

  4.   

    建了个储存过程,可以通过编译,有些地方不太对给你参考下:create or replace procedure p_backupEmp (
    menu_id out varchar2,
    PGM_ID out varchar2,
    CNAME  out varchar2)as 
    str_sql varchar2(500);
      begin
       str_sql:= 'SELECT '||menu_id|| PGM_ID||'WM_CONCAT('||CNAME||')'||CNAME||'FROM menupgm';
         execute immediate str_sql;
    end ;
    /
      

  5.   

    为什么创建存储过程后执行不了?
    SQL*Plus: Release 3.3.4.0.0 - Production on Thu Apr 09 14:05:02 2009Copyright (c) Oracle Corporation 1979, 1996.  All rights reserved.
    硈: 
    Oracle8i Enterprise Edition Release 8.1.6.0.0 - Production
    With the Partitioning option
    JServer Release 8.1.6.0.0 - ProductionSQL> var results refcursor;
    SQL> exec public_mgr.pkg_test.prc_test(results);
    begin public_mgr.pkg_test.prc_test(results); end;                                   *
    第1行發生錯誤:
    ORA-06550: 第1行, 第36個欄位:
    PLS-00201: 識別字 'RESULTS' 必須被宣告
    ORA-06550: 第1行, 第7個欄位:
    PL/SQL: Statement ignored
    SQL> 
      

  6.   

    是个串连接的过程吧。M0000 pvi08 test_1 Z2 Z3 Z31 Z6 Z7  是结果集还是列啊。SQL> select WM_CONCAT(dept) from a group by name;WM_CONCAT(DEPT)
    ------------------------------------------------------------------------------A1,A2,A3
    B1,B4,B2,B3
    C1,C2SQL> select name,dept from a;NAME   DEPT
    ------ ------
    A      A1
    A      A2
    A      A3
    B      B1
    B      B2
    B      B3
    B      B4
    C      C1
    C      C2已选择9行。SQL> select WM_CONCAT(dept) from a group by name;WM_CONCAT(DEPT)
    ------------------------------------------------------------------------------A1,A2,A3
    B1,B4,B2,B3
    C1,C2
      

  7.   

    select menu_id,pgm_id,cname,replace(wmsys.wm_concat(role_id),',',' ') as tid 
    from tab group by menu_id,pgm_id,cname
      

  8.   


    select menu_id,pgm_id,cname,  
    sum(case role_id when 'Z2'  then Z2 else 自己根据设置值 end) as Z2, 
    sum(case role_id when 'Z3'  then Z3 else 自己根据设置值 end) as Z3, 
    sum(case role_id when 'Z31 '  then Z31 else 自己根据设置值 end) as Z31,
    ..................
    from xxx 
    group by menu_id,pgm_id,cname....
    除了sum中的项
      

  9.   


    如果是8i版本的怎么写? 没有wmsys.wmconcat这个函数
      

  10.   

    lz是想把role_id 列拆成几列还是合并?如果是后者的话,可以用sys_connect_by_path
      

  11.   


    SYS_CONNECT_BY_PATH 是9i的吧?....
      

  12.   

    唉....用max+decode写成字符串了,还把查询给写死了.... 先这么着吧....等待高手给出更好的解法!!!
      

  13.   

    M0000 pvi08 test_1 Z2 Z3 Z31 Z6 Z7 
    M0000 fc018 test_2 Z00Z Z3211 
    问的不清楚  还要考虑你的想法  累
    1 Z2 Z3 Z31 Z6 Z7  放一个字段里用空格阁开??
    2 动态生成字段 存在不同的字段中都可以实现