两个表t1,t2 
t1列: aa ,bb ,cc 
数据: a1   b1    2 
       a1   b2    5 
      a2   b1    3 
      a3   b2    1 
t2列:  bb  
数据:  b1     
       b2     
       b1     
       b2    
希望得到t3: 
列:  aa ,b1 ,b2 
数据:a1  2   5 
     a2  3   0 
     a3  0   1 希望高手指教如何编写sql语句得到t3显示数据!!!

解决方案 »

  1.   

    列变行??还是写pl\sql吧,用动态sql
      

  2.   

    --如果bb只有b1,B2兩個值﹐那么語句可以這樣寫,好象t2是多余的
    select t1.aa,t4.b1,t5,b2
    from t1,
    (select aa,cc b1
      from t1
      where bb='b1') t4,
    (select aa,cc b2
      from t1
      where bb='b2') t5
    where t1.aa=t4.aa(+)
    and t1.aa=t5.aa(+)
    --本機沒有裝ORACLE,格式可能不一定正確﹐方法基本是這樣
      

  3.   

    (1)
    select t1.aa,sum(decode(t1.bb,'b1',cc,0)) as b1,
       sum(decode(t1.bb,'b2',cc,0)) as b2
    from t1,(select distinct bb from t2)a where a.bb=t1.bb
    group by t1.aa(2)
    declare v_sql varchar2(1000):='select t1.aa,';
    cursor cur_name is select distinct bb from t2;
    begin
    for c in cur_name loop
       v_sql:=v_sql||'sum(decode(t1.bb,'''||c.bb||''',t1.cc,0)) as '||c.bb||',';
    end loop;
    v_sql:=substr(v_sql,1,length(v_sql)-1)||' from t1,(select distinct bb from 
    t2)a where a.bb=t1.bb  group by t1.aa';
    execute immediate v_sql;
    dbms_output.put_line(v_sql);
    end;
    /
    ----(2)会输出一个SQL语句,然后把该SQL语句copy下来,运行
      

  4.   

    如果t2数据量比较大,就会(2)生成的SQL吧
      

  5.   

    第二种方法报错,提示execute immediate 一句 缺少表达式
      

  6.   


    select * from dual;
      

  7.   

    select * from dual;
    select sum(111)