select * from dual where a = 'aaa';a     |     b
-----------------
aaa         bbb
aaa         ccc
aaa         ddd如果我想把它转成如下一行记录四列的格式SQL该怎么写?上面的行数和下面的列数是对应并且动态的a     |     b     |     c     |    d
---------------------------
aaa        bbb         ccc        ddd

解决方案 »

  1.   

    用wmsys.wm_concat()好像只能做到下面这个效果:select a , wmsys.wm_concat(b) from dual where a = 'aaa' group by a;a     |    bcd
    ---------------------------
    aaa        bbb,ccc,ddd有什么好办法吗?
      

  2.   

    用 SUM(DECODE(***))的方法好像也不行,郁闷死了
      

  3.   

    declare
      strSql varchar2(1000) := '';
      i int := 0;
    begin
      dbms_output.put_line('select ' || '''aaa'',');
      for listTable in (select * from tableName) loop
        i := i + 1;
        strSql := '''' || listTable.b || ''' as field' || to_char(i) || ',';
        dbms_output.put_line(strSql);
      end loop;
      dbms_output.put_line(' '''' from dual');
    end;--把打印在output里的字符运行一下,就是你要的结果,你无非就是想拼串
      

  4.   

    想用一个sql来实现动态的转置有些困难,还是写个存储过程实际点.
    给你一个思路吧
    先用分析函数给你的记录一个标识,就是c字段..
    a | b   | c
    -----------------
    aaa bbb    1
    aaa ccc     2
    aaa ddd    3
    sql差不多是select a,b,row_number() over (partition by a order by b) rn from XX
    然后在确定最大的标识字段,就是c字段最大是多少.
    然后通过c字段用一般的行转列的方法就能获得你要的动态效果了...