这些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

解决方案 »

  1.   

    这个分我不接了,我只知道用存储过程把sql给拼出来,oracle只能这样了
      

  2.   

    --测试数据
    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
      

  3.   

    在这点搜索-行列转换
    你可以搜索到一大把的有关帖子
    固定列的就用DECODE不固定的就用存储过程
      

  4.   

    比如说有数据
    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