这些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]
GOid 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]
GOid 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
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]
GOid 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]
GOid 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
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不固定的就用存储过程
Name class score
小明 语文 80
小强 数学 90
小明 英语 89
小强 语文 70
小明 数学 95
小强 英语 85要求出来
姓名 语文 数学 英语
小明 80 95 89
小强 70 90 85这时候就以用decode来做
SELECT NAME 姓名, SUM (DECODE (CLASS, '语文', score, 0)) 语文,
SUM (DECODE (CLASS, '数学', score, 0)) 数学,
SUM (DECODE (CLASS, '英语', score, 0)) 英语
FROM table
GROUP BY NAME