存储过程构建交叉表语句

test表
   XM SL
1 王一 2
2 王一 5
3 张二 4
4 张二 5
5 张二 8
6 李三 2
7 李三 4
8 李三 15
9 李三 29

输出的select语句
select xm,
       sum(case xm
             when '王一' then
              sl
             else
              0
           end) as 王一,
       sum(case xm
             when '张二' then
              sl
             else
              0
           end) as 张二,
       sum(case xm
             when '李三' then
              sl
             else
              0
           end) as 李三
  from test
 group by xm


语句运行结果
   XM 王一 张二 李三
1 王一 7 0 0
2 张二 0 17 0
3 李三 0 0 50

declare
sqlstr varchar2(32767);
begin
sqlstr:='select xm,';
--构造字符串
for v_cur in (select distinct xm from test)
loop
sqlstr:=sqlstr||'sum(case xm when '''|| v_cur.xm ||''' then sl else 0 end ) as '|| v_cur.xm ||',';
end loop;
sqlstr := substr(sqlstr,0,length(sqlstr)-1) ||' from test group by xm';
DBMS_OUTPUT.PUT_LINE(sqlstr);
--open p_cursor for sqlstr;
end;

你可能感兴趣的:(oracle)