SQL code--横列转换
create table TTbl1 as
select 2000 nyear,'王五' sname,'2w' sSalary from dual
union select 2000,'马三','3w' from dual
union select 2001,'王五','4w' from dual
union select 2001,'马三','6w' from dual;
declare
cursor c1 is
select nyear,avg(case when instr(sSalary,'w')>0 then To_number(substr(sSalary,1,instr(sSalary,'w')-1)) else 0 end) as sSalary1
from ttbl1
group by nyear
order by nyear asc;
sSql varchar2(2000);
sSql1 varchar2(2000);
sSql2 varchar2(2000);
icount number;
c2 c1%rowtype;
vTbl varchar2(20);
function CheckTableExist(NewTableName varchar2) return integer as
v_Count integer;
begin
select count(*) into v_Count from user_tables where
upper(trim(table_name))=upper(trim(NewTableName));
if v_Count=0 then
return 0;
else
return 1;
end if;
exception
when others then
return 0;
end;
begin
sSql := 'create table TmpTbl1(';
sSql1 := 'insert into TmpTbl1';
sSql2 := ' select ';
icount := 0;
open c1;
loop
fetch c1 into c2;
exit when c1%notfound;
icount := icount+1;
if iCount = 1 then
sSql := sSql||'y'||c2.nyear||' varchar2(20)';
sSql2 := sSql2||c2.sSalary1;
else
sSql := sSql||',y'||c2.nyear||' varchar2(20)';
sSql2 := sSql2||','||c2.sSalary1;
end if;
end loop;
close c1;
sSql := sSql||')';
sSql2 := sSql1||' '||sSql2||' from dual';
vTbl := 'TmpTbl1';
if CheckTableExist(vTbl) = 1 then
execute immediate 'drop table '||vTbl;
end if;
execute immediate sSql;
execute immediate sSql2;
commit;
end;
select * from TmpTbl1;