1.现有数据
  数据一:
   字段A    字段B
    1         A
    2         B
    3         C     
 数据二:
   字段C     字段D
    1         D
    2         E
    3         F
现在我需要这样的效果:   字段E    字段F    字段G 
     A-D     A-E       A-F  
     B-D     B-E       B-F
     C-D     C-E       C-F
说明:  字段最为基行,然后字段B按顺序减去D ,
    如果数据二有10行,则结果数据有10列
   数据一有多少行,则结果数据就有多少行  
        

解决方案 »

  1.   

    --如果数据二中的列不多的话可以用语句,要不就要写过程了
    with tb as (
    select 1 col1, 'A' col2 from dual union all
    select 2, 'B' from dual union all
    select 3, 'C' from dual),
    tbb as(
    select 1 col1, 'D' col2 from dual union all
    select 2, 'E' from dual union all
    select 3, 'F' from dual)
    select tb.col1,max(decode(tbb.col2,'D',tb.col2||'-'||tbb.col2)),
          max(decode(tbb.col2,'E',tb.col2||'-'||tbb.col2)),
         max(decode(tbb.col2,'F',tb.col2||'-'||tbb.col2))
    from tb,tbb
    group by tb.col1
          COL1 MAX MAX MAX
    ---------- --- --- ---
             1 A-D A-E A-F
             2 B-D B-E B-F
             3 C-D C-E C-F
      

  2.   

    动态行列转换:http://topic.csdn.net/u/20100109/13/6a10c168-f190-4766-b838-adbf03c4ac7b.html?96880
      

  3.   


    scott@YPCOST> ed
    已写入 file afiedt.buf  1  create table tbb as(
      2  select 1 col1, 'D' col2 from dual union all
      3  select 2, 'E' from dual union all
      4* select 3, 'F' from dual)
    scott@YPCOST> /表已创建。scott@YPCOST> create table tb as (
      2  select 1 col1, 'A' col2 from dual union all
      3  select 2, 'B' from dual union all
      4  select 3, 'C' from dual)
      5  /表已创建。
    scott@YPCOST> ed
    已写入 file afiedt.buf  1  create or replace view row_col_view
      2  as
      3  select tb.col1 id1,tbb.col1 id2,tbb.col2 name2,tb.col2 name1
      4* from tb,tbb
    scott@YPCOST> /视图已创建。scott@YPCOST> select * from row_col_view;       ID1        ID2 N N
    ---------- ---------- - -
             1          1 D A
             1          2 E A
             1          3 F A
             2          1 D B
             2          2 E B
             2          3 F B
             3          1 D C
             3          2 E C
             3          3 F C已选择9行。--创建过程(修改了下狂浪的过程)
    /*修改部分
    '(decode('||column_col||','''||v1||''','||
                       value_col||chr(124)||chr(124)||'''-'''||chr(124)||chr(124)||column_col||'))'
    上面是形成name2||'-'||name2 这种格式
    拼接||还真是一件麻烦事啊 不过相信楼住应该是数字的减法吧
    那么修改为
    '(decode('||column_col||','''||v1||''','||
                       value_col'-'column_col||'))'*/
    create or replace procedure row_to_col(tabname in varchar2,
                                      group_col in varchar2,
                                      column_col in varchar2,
                                      value_col in varchar2,
                                      Aggregate_func in varchar2 default 'max',
                                      colorder in varchar2 default null,
                                      roworder in varchar2 default null,
                                      when_value_null in varchar2 default null,
                                      viewname in varchar2 default 'v_tmp')
    Authid Current_User
    as
      sqlstr varchar2(2000):='create or replace view '||viewname||' as select '||group_col||' ';
      c1 sys_refcursor;
      v1 varchar2(100);
    begin
      open c1 for 'select distinct '||column_col||' from '||tabname||case when colorder is not null then ' order by '||colorder end;
      loop
        fetch c1 into v1;
        exit when c1%notfound;
        sqlstr:=sqlstr||chr(10)||','||case when when_value_null is not null then 'nvl(' end||
          Aggregate_func||'(decode('||column_col||','''||v1||''','||
                       value_col||chr(124)||chr(124)||'''-'''||chr(124)||chr(124)||column_col||'))'||
          case when when_value_null is not null then chr(44) ||when_value_null||chr(41) end||'"'||v1||'"';
      end loop;
      close c1;
      sqlstr:=sqlstr||' from '||tabname||' group by '||group_col||case when roworder is not null then ' order by '||roworder end;
      execute immediate sqlstr;
    end row_to_col;scott@YPCOST> exec row_to_col('row_col_view','id1','name2','name1');PL/SQL 过程已成功完成。scott@YPCOST> select * from v_tmp;       ID1 D   E   F
    ---------- --- --- ---
             1 A-D A-E A-F
             2 B-D B-E B-F
             3 C-D C-E C-F
      

  4.   


    --修正下这个
    不过相信楼住应该是数字的减法吧
    那么修改为
    '(decode('||column_col||','''||v1||''','||
                       value_col'-'column_col||'))'
    --应该是
    不过相信楼住应该是数字的减法吧
    那么修改为
    '(decode('||column_col||','''||v1||''','||
                       value_col||'-'||column_col||'))'
      

  5.   

    最后然产生的列不固定,写存储过程动态拼SQL执行就行了。
      

  6.   

    create or replace procedure p_col(g_col varchar2,c_col varchar2,cur out sys_refcursor)
    as
    str varchar2(4000);
    begin
    for i in(select col2 c2 from tb2) loop
    str:=str||', max(decode(b.'||c_col||','''||i.c2||''',a.'||g_col||'||''-''||b.'||c_col||')) col'||i.c2;
    end loop;
    str:='select a.'||g_col||str||' from tb a,tb2 b group by a.'||g_col;
    open cur for str;
    end;
    ---运行SQL> create or replace procedure p_col(g_col varchar2,c_col varchar2,cur out sys_refcursor)
      2  as
      3  str varchar2(4000);
      4  begin
      5  for i in(select col2 c2 from tb2) loop
      6  str:=str||', max(decode(b.'||c_col||','''||i.c2||''',a.'||g_col||'||''-''||b.'||c_col||')) col'||i.c2;
      7  end loop;
      8  str:='select a.'||g_col||str||' from tb a,tb2 b group by a.'||g_col;
      9  open cur for str;
     10  end;
     11  /
     
    Procedure created
     
    scott@ORCL> select * from tb
      2  /      COL1 C
    ---------- -
             1 A
             2 B
             3 Cscott@ORCL> select * from tb2
      2  /      COL1 C
    ---------- -
             1 D
             2 E
             3 Fscott@ORCL> var cur refcursor
    scott@ORCL> exec p_col('col2','col2',:cur)
    scott@ORCL> print curC COL COL COL
    - --- --- ---
    A A-D A-E A-F
    B B-D B-E B-F
    C C-D C-E C-F
      

  7.   

    http://topic.csdn.net/u/20100109/13/6a10c168-f190-4766-b838-adbf03c4ac7b.html
      

  8.   

    SELECT 
    MAX(DECODE(RN,1,field1||'-'||field2,NULL)),
    MAX(DECODE(RN,2,field1||'-'||field2,NULL)),
    MAX(DECODE(RN,3,field1||'-'||field2,NULL)),
    FROM 
    (
    SELECT 
    t1.*,
    ROW_NUBMER() OVER(PARTITION BY filed1 ORDER BY field2 ) "RN" 
    FROM (
    SELECT a.b "field1", b.d "field2"
    FROM a,b
    )t1
    )
    GROUP BY field1;
    如果要动态列的话需要写个存储过程