首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > oracle >

oracle 不确定列的行列转换解决方法

2012-05-24 
oracle 不确定列的行列转换这些sql server 的语句如何转换为oracle pl/sql (行列转置)?高手请进。SOSdeclar

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 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不固定的就用存储过程
[解决办法]
行列转换已经成为周经问题了

热点排行