动态多行转一列,没想明白咋做
TABLE1
ID COL VAL
1  11  111
1  22  222
1  33  333
...转换后
ID COl11 COL22 COL3 ...
1  111   222   333由于行数不定的,所以没明白咋做
用存储过程也不是很好做

解决方案 »

  1.   

    参考:
    http://topic.csdn.net/u/20100109/13/6a10c168-f190-4766-b838-adbf03c4ac7b.html?92131
    或者看看这个帖子:
    http://topic.csdn.net/u/20110214/14/272200ac-c631-4a2c-b980-6e1404907d4d.html
      

  2.   

    行数不定的话,估计就要用到正则了 
    如果不用正则,就得先把行数的最大值查出来,根据level处理,不知道可行不可行
    还有 col11 col22这样的方式估计没法实现
      

  3.   


    --关键是要去尝试:有思路就好
    --再写一次:Connected to:
    Oracle Database 10g Release 10.1.0.2.0 - ProductionSQL> set serveroutput on
    SQL> set linesize 30000
    SQL> select * from tab;ID         COL        VAL
    ---------- ---------- ----------
    1          11         111
    1          22         222
    1          33         333SQL> edit
    Wrote file afiedt.buf  1  create or replace procedure row_to_col_func2(cur out sys_refcursor)
      2  as
      3    sqlstr varchar2(2000):='select id';
      4  begin
      5       for rs in (select distinct col from tab ) loop
      6         sqlstr:=sqlstr||chr(10)||','||'max(decode(col,'''||rs.col||''',val,'''')) '||'col'||rs.col;
      7       end loop ;
      8       sqlstr:=sqlstr||chr(10)||'from tab  group by id ' ;
      9       open cur for sqlstr;
     10* end row_to_col_func2;
    SQL> /Procedure created.SQL> var cur refcursor
    SQL> exec row_to_col_func2(:cur);PL/SQL procedure successfully completed.SQL> print curID         COL11      COL22      COL33
    ---------- ---------- ---------- ----------
    1          111        222        333SQL> INSERT INTO tab VALUES('1','44','555');1 row created.SQL> INSERT INTO tab VALUES('1','55','555');1 row created.SQL> INSERT INTO tab VALUES('1','66','666');1 row created.SQL> commit;Commit complete.SQL>  exec row_to_col_func2(:cur);PL/SQL procedure successfully completed.SQL> print curID         COL11      COL22      COL33      COL44      COL55      COL66
    ---------- ---------- ---------- ---------- ---------- ---------- ----------
    1          111        222        333        555        555        666SQL> 
      

  4.   

    建议楼主在参数中加入where语句,也许会使程序更加通用:
    tabname 需要进行行转列操作的表名;
    group_col 查询结果要按某列或某些列分组的字段名;
    column_col 要从行转成列的字段;
    value_col 需要聚合的值字段;
    Aggregate_func 选用的聚合函数,可选,默认为max;
    where_value where子句,对满足条件的行做转换
    colorder 行转列后列的排序,可选;
    roworder 行转列后记录的排序,可选;
    when_value_null 若value_col字段的值聚合后为空,则转换成该值,可选;
    viewname 创建的视图名称,可选,默认为v_tmp。
      

  5.   

    同时也把自己整理资料连接如下:
    http://blog.csdn.net/leisore/archive/2011/02/15/6186827.aspx