create table T(员工 varchar2(20),商品 varchar2(20),卖出数量 numeric(5,0))
insert into T values('张','显示器',1)
insert into T values('张','鼠标  ',5)
insert into T values('张','光驱  ',1)
insert into T values('李','键盘  ',3)
insert into T values('赵','显示器',3)declare col1 T.商品%type;        --定义类型
sqlstr varchar2(8000);
cursor c_try is select distinct 商品 from T;
begin
    sqlstr:='';
    open c_try;
    loop
    fetch c_try into col1;
    exit when c_try%notfound;
    sqlstr:=sqlstr||', sum(decode(商品,'''||col1||''',卖出数量,0)) as '||col1;
    exit when c_try%notfound;
    end loop;
    close c_try;
    sqlstr:='create table tt as select 员工'||sqlstr||' from T group by 员工';
    --tt为刚创建的一个保存结果的表
    execute immediate sqlstr;
end;--执行
select * from tt;
/*
员工   显示器  键盘  鼠标  光驱
-----  ------  ----  ----  ----
张     1       0     5     1
李     0       3     0     0
赵     3       0     0     0
*/

解决方案 »

  1.   

    楼上:
    SQL> create table aa(emp varchar2(20),sp varchar2(20),sl numeric(5,0));表已创建。SQL> insert into aa values('张','显示器',1);已创建 1 行。SQL> insert into aa values('张','鼠标  ',5);已创建 1 行。SQL> insert into aa values('张','光驱  ',1);已创建 1 行。SQL> insert into aa values('李','键盘  ',3);已创建 1 行。SQL> insert into aa values('赵','显示器',3);已创建 1 行。SQL> declare col1 aa.sp%type;        --定义类型
      2  sqlstr varchar2(8000);
      3  cursor c_try is select distinct sp from aa;
      4  begin
      5      sqlstr:='';
      6      open c_try;
      7      loop
      8      fetch c_try into col1;
      9      exit when c_try%notfound;
     10      sqlstr:=sqlstr||', sum(decode(sp,'''||col1||''',sl,0)) as '||col1;
     11      exit when c_try%notfound;
     12      end loop;
     13      close c_try;
     14      sqlstr:='create table tt as select emp'||sqlstr||' from aa group by em
     15      --tt为刚创建的一个保存结果的表
     16      execute immediate sqlstr;
     17  end;
     18  
     19  /PL/SQL 过程已成功完成。SQL> select * from aa;EMP                  SP                           SL
    -------------------- -------------------- ----------
    张                   显示器                        1
    张                   鼠标                          5
    张                   光驱                          1
    李                   键盘                          3
    赵                   显示器                        3
      

  2.   

    楼主看错了最后一段查询处理,execute语句生成了一个新表tt,交叉表查询结果保存在该表中:
    ----------------------------------------------------------------------------------------------------------------------------------------------
    --执行
    select * from tt;