日期:2014-05-17  浏览次数:21442 次

oracle 不确定列的行列转换
这些sql server 的语句如何转换为oracle pl/sql (行列转置)?高手请进。SOS
declare @sql varchar(8000)
set @sql='select sid'
select @sql=@sql+','+course.name+'=isnull(sum(case course when '''+course.name+''' then result end),0)'
from course order by id 
set @sql=@sql+' from result group by sid order by sid'
print @sql
exec(@sql)

该功能是实现了课程表course和成绩表的行列转换。

course表
CREATE TABLE [dbo].[course] (
  [id] [int] IDENTITY (1, 1) NOT NULL ,
  [name] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL 
) ON [PRIMARY]
GO

id name 
1 语文
2 数学
3 英语

CREATE TABLE [dbo].[result] (
  [id] [int] IDENTITY (1, 1) NOT NULL ,
  [sid] [int] NULL ,
  [course] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
  [result] [decimal](18, 0) NULL 
) ON [PRIMARY]
GO

id sid course result 
1 2005001 语文 80
2 2005001 数学 80
3 2005001 英语 80
4 2005002 语文 69
5 2005002 数学 80
6 2005002 英语 89


查了很多资料都没有实现,希望高手帮忙。

以上sql 在sql server中显示了正确的预期效果:
sid   语文 数学 英语
2005001 80  80 80
2005002 69  80 89

------解决方案--------------------
这个分我不接了,我只知道用存储过程把sql给拼出来,oracle只能这样了
------解决方案--------------------
SQL code
--测试数据
create table t (XH varchar2(10), DDATE date, SXF int);
insert into t
select 1,sysdate,10 from dual union all
select 1,sysdate+1,14 from dual union all
select 1,sysdate+2,23 from dual union all
select 2,sysdate,21 from dual union all
select 2,sysdate+1,24 from dual union all
select 3,sysdate,13 from dual union all
select 3,sysdate+1,22 from dual;
--
create or replace package sp_test
is
type ResultData is ref cursor;
procedure getRstData( rst out ResultData);
end sp_test;
/
create or replace package body sp_test
is
procedure getRstData( rst out ResultData)
is
begin
declare
cursor cur is select distinct (DDATE) from t;
tmp_ddate date;
str varchar2(4000);
begin
str:='select xh';
open cur;
loop
fetch cur into tmp_ddate;
exit when cur%notfound;
str:=str||',sum(decode(to_char(ddate,''yyyymmdd''),'||chr(39)||to_char(tmp_ddate,'yyyymmdd')||chr(39)||',sxf,0)) "'||to_char(tmp_ddate,'yyyymmdd')||'"';
end loop;
str:=str||' from t group by xh';
-- dbms_output.put_line(str);
close cur;
open rst for str;
end;
end;
end sp_test;
/

--输出结果
1 10 14 23
2 21 24 0
3 13 22 0

------解决方案--------------------
在这点搜索-行列转换
你可以搜索到一大把的有关帖子
固定列的就用DECODE不固定的就用存储过程
------解决方案--------------------
行列转换已经成为周经问题了