在网上找的例子:
//生成表
IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb]
GO
create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int)
insert into tb values('张三' , '语文' , 74)
insert into tb values('张三' , '数学' , 83)
insert into tb values('张三' , '物理' , 93)
insert into tb values('李四' , '语文' , 74)
insert into tb values('李四' , '数学' , 84)
insert into tb values('李四' , '物理' , 94)
go//用此SQL就能达到动态行转列效果
declare @sql varchar(8000)
set @sql = 'select 姓名 '
select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 + ']'
from (select distinct 课程 from tb) as a
set @sql = @sql + ' from tb group by 姓名'
exec(@sql)出来结果是:
姓名   数学   物理   语文
李四   84     94     74
张三   83     93     74数学在最前面了 完全是按照首字字母排序的
我想达到的效果是:
姓名   语文   数学   物理   
李四   74     84     94     
张三   74     83     93  
就是说按照插入的顺序来排序 也可以再加个自增ID 根据自增ID排序 小弟不会写 请高手解答!!!   

解决方案 »

  1.   

    create table tb(ID int,姓名 varchar(10) , 课程 varchar(10) , 分数 int)
    insert into tb values(1,'张三' , '语文' , 74)
    insert into tb values(2,'张三' , '数学' , 83)
    insert into tb values(3,'张三' , '物理' , 93)
    insert into tb values(4,'李四' , '语文' , 74)
    insert into tb values(5,'李四' , '数学' , 84)
    insert into tb values(6,'李四' , '物理' , 94)declare @sql varchar(8000)
    set @sql = 'select 姓名 '
    select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 + ']'
    from (select 课程,id from tb t where id=(select top 1 id from tb where t.课程=课程)) as a order by ID
    set @sql = @sql + ' from tb group by 姓名'
    exec(@sql)/*
    姓名    语文  数学  物理
    李四 74   84 94
    张三 74   83 93*/
      

  2.   

    楼主SQL SERver 里有直接转换行列的,我忘记怎么写了,但是是有的 我看到过