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只能这样了
[解决办法]
--测试数据create table t (XH varchar2(10), DDATE date, SXF int);insert into tselect 1,sysdate,10 from dual union allselect 1,sysdate+1,14 from dual union allselect 1,sysdate+2,23 from dual union allselect 2,sysdate,21 from dual union allselect 2,sysdate+1,24 from dual union allselect 3,sysdate,13 from dual union allselect 3,sysdate+1,22 from dual;--create or replace package sp_testistype ResultData is ref cursor;procedure getRstData( rst out ResultData);end sp_test;/create or replace package body sp_testisprocedure getRstData( rst out ResultData)isbegindeclarecursor cur is select distinct (DDATE) from t;tmp_ddate date;str varchar2(4000);beginstr:='select xh';open cur;loopfetch 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 232 21 24 03 13 22 0
[解决办法]
在这点搜索-行列转换
你可以搜索到一大把的有关帖子
固定列的就用DECODE不固定的就用存储过程
[解决办法]
行列转换已经成为周经问题了