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 SERVER 2005 动态SQL。 
declare @sql2 varchar(8000) 
declare @sql varchar(8000) 
select @sql = isnull(@sql + ',' , '') + '[' + 课程 + ']' from tb group by 课程 
set @sql2= ('select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b') 
print @sql2
exec ('select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b') 
select * FROM tb
有表如上,2005的写法。现在他查询出来的顺序就是 ----数学,物理,语文我估计他是按拼音头一个字母排序的, 那我现在对这个动态的语句如何定义自己的排序呢?
比方说我想 按 数学,语文,物理 排序这个动态的语句要怎么实现呢?请都用动态的方法,比方说我不知道课程下有多少种课程类型。
要怎么排序我的行转列后的字段顺序呢?
因为查询的时候经常会出现如分数大于80分后,只有物理和数学出现,
那无法知道行中具体有多少课程种类。或者查询名字时,有的人有科目没有考,那也无法
知道行中具体有多少课程种类

解决方案 »

  1.   

    --SQL SERVER 2000 动态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) 
      

  2.   

    --SQL SERVER 2005 动态SQL。
    declare @sql varchar(8000)
    select @sql = isnull(@sql + ',' , '') + 课程 from tb group by 课程
    exec ('select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b')
      

  3.   

    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 SERVER 2005 动态SQL。 
    declare @sql2 varchar(8000) 
    declare @sql varchar(8000) 
    select 课程 into #tb 
        from tb group by 课程 order by CHARINDEX(课程,'数学物理语文')
    select @sql = isnull(@sql + ',' , '') + '[' + 课程 + ']' 
        from #tb 
    drop table #tb               
    exec ('select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b') /*
    (3 行受影响)
    姓名         数学          物理          语文
    ---------- ----------- ----------- -----------
    李四         84          94          74
    张三         83          93          74(2 行受影响)
      

  4.   


    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 SERVER 2005 动态SQL。 
    declare @sql2 varchar(8000) 
    declare @sql varchar(8000) 
    select @sql = isnull(@sql + ',' , '') + '[' + 课程 + ']' from tb group by 课程 order by CHARINDEX(课程,'数学物理语文') --排序方式
    set @sql2= ('select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b') 
    print @sql2
    exec ('select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b') 
    select * FROM tb
      

  5.   


    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 drop table tb--SQL SERVER 2005 动态SQL。 
    declare @sql2 varchar(8000) 
    declare @sql varchar(8000) 
    select @sql = isnull(@sql + ',' , '') + '[' + 课程 + ']' from (select top 100 percent *,Rank() over (order by CHARINDEX(课程,'数学语文物理')) row_num from tb) a group by 课程,row_num order by row_num
    print @sql
    set @sql2= ('select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b') 
    print @sql2
    exec ('select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b') /*
    姓名         数学          语文          物理
    ---------- ----------- ----------- -----------
    李四         84          74          94
    张三         83          74          93(2 行受影响)*/