我搜索了以往的帖子,发现以下方法是我需要的,就请问 
declare @sql varchar(8000)
set @sql = 'select name'
select @sql = @sql + ',sum(case km when '''+km+''' then cj end) ['+km+']'
 from (select distinct km from test) as a
select @sql = @sql+' from test group by name'
exec(@sql)
这段话是放在什么地方执行的?我在sql plus 里面执行不过去,请大虾指教。谢谢诸位了!方法如下:纵转换为横。
有表:test(name char(10),km char(10),cj int)
name  km  cj
----------------------------------------------
张三  语文  80
张三  数学  86
张三  英语  75
李四  语文  78
李四  数学  85
李四  英语  78要求以横向格式显示,即:
想变成姓名   语文   数学   英语
----------------------------
张三   80     86     75
李四   78     85     78Create table test (name char(10),km char(10),cj int)
go
insert test values('张三','语文',80)
insert test values('张三','数学',86)
insert test values('张三','英语',75)
insert test values('李四','语文',78)
insert test values('李四','数学',85)
insert test values('李四','英语',78)
方法:
declare @sql varchar(8000)
set @sql = 'select name'
select @sql = @sql + ',sum(case km when '''+km+''' then cj end) ['+km+']'
 from (select distinct km from test) as a
select @sql = @sql+' from test group by name'
exec(@sql)

解决方案 »

  1.   

    楼主查到的是SQL Server里动态行转列处理的代码,在Oracle里用这一段:
    ----------------------------------------------------------------------------------------------------------------------------
    create table test (name varchar2(10),km varchar2(10),cj numeric);
    insert test values('张三','语文',80);
    insert test values('张三','数学',86);
    insert test values('张三','英语',75);
    insert test values('李四','语文',78);
    insert test values('李四','数学',85);
    insert test values('李四','英语',78);--测试
    declare col1 test.km%type;        --定义类型
    sqlstr varchar2(8000);
    cursor c_try is select distinct km from test;
    begin
        sqlstr:='';
        open c_try;
        loop
        fetch c_try into col1;
        exit when c_try%notfound;
        sqlstr:=sqlstr||', max(decode(km,'''||col1||''',cj,0)) as '||col1;
        exit when c_try%notfound;
        end loop;
        close c_try;
        sqlstr:='create table tt as select 姓名'||sqlstr||' from test group by 姓名';
        --tt为刚创建的一个保存结果的表
        execute immediate sqlstr;
    end;--执行
    select * from tt;
      

  2.   

    非常感谢  libin_ftsafe(子陌红尘) ,现在就结贴给分