假设我有个Table C,内容如下
date       name      value
20070701   AA        100
20070701   BB        100
20070702   AA        200
20070702   BB        200
20070703   AA        300
20070703   BB        300
我现在想把它显示成
date       name      value
20070701   AABB      200
20070701   AABB      400
20070702   AABB      600
这个PLSQL应该怎么写呀,谢谢!
怎样用函数的方法解决呢?

解决方案 »

  1.   

    --测试数据
    create table tablec(cdate varchar2(100), cname varchar2(100), cvalue int );
    insert into tablec
    select '20070701','AA',100 from dual union all 
    select '20070701','BB',100 from dual union all
    select '20070702','AA',200 from dual union all
    select '20070702','BB',200 from dual union all
    select '20070703','AA',300 from dual union all
    select '20070703','BB',300 from dual;
    --建立函数
    create or replace function sum_string(v_sql varchar2)
    return varchar2
    as
    type cur_alldata is ref cursor;
    l_alldata cur_alldata;
    v_row varchar2(99);
    v_sum varchar2(3999);
    begin
    open l_alldata for v_sql;
    loop
    fetch l_alldata into v_row;
    exit when l_alldata%notfound;
    v_sum := v_sum||v_row;
    end loop;
    close l_alldata;
    return v_sum;
    end;
    --执行查询
    select cdate,
    sum_string('select cname from tablec where cdate='''||cdate||''' group by cdate,cname') cname,
    sum(cvalue) cvalue
    from tablec
    group by cdate;
    --测试结果
    20070701 AABB 200
    20070702 AABB 400
    20070703 AABB 600
      

  2.   

    一句话的方法:
    select ttt.cdate, ltrim(MAX(sys_connect_by_path(cname, ',')), ','),sum(cvalue) from 
    (select t.*, (row_number() over (partition by t.cdate ORDER BY t.cname )) NumID from tablec t) ttt 
      START  WITH NumID = 1
      CONNECT BY NumID-1 = PRIOR NumID 
    group by ttt.cdate