select 姓名,'语文' as 课程,语文 as 分数 into tb from tablebame
union
select 姓名,'数学' as 课程,数学 as 分数 from tablebame
union
select 姓名,'物理' as 课程,物理 as 分数 from tablebame
--sql2000
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) ---sql2005
declare @sql varchar(8000)
select @sql = isnull(@sql + '],[' , '') + 姓名 from tb group by 姓名
set @sql = '[' + @sql + ']'
exec ('select * from (select * from tb) a pivot (max(分数) for 姓名 in (' + @sql + ')) b')
其中 sql2000 中的max  在这里的含义什么
sql2005 这句请解析一下 非常感谢

解决方案 »

  1.   

    参考--sql2000
    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)  --对应姓名,有值为 X的时候 ,则为分数,其他为0,max后,则选出来的就是分数值。
    --这样就可以对应到姓名为X的这列中
    ---sql25
    declare @sql varchar(8000)
    select @sql = isnull(@sql + '],[' , '') + 姓名 from tb group by 姓名
    set @sql = '[' + @sql + ']'
    exec ('select * from (select * from tb) a pivot (max(分数) for 姓名 in (' + @sql + ')) b')参考 pivot的语法http://technet.microsoft.com/zh-cn/library/ms177410.aspx
      

  2.   

    http://blog.csdn.net/longyi007/article/details/6302223
      

  3.   

    --sql2000
    ---max 是将多列组合成一行,,这里除了用max,还可以MIN类似的聚合函数
    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)  ---sql2005 pivot 前面是查出来的视图,然后通过分数组合,分数就是数据内容,姓名在条件内的列名,,即表头
    declare @sql varchar(8000)
    select @sql = isnull(@sql + '],[' , '') + 姓名 from tb group by 姓名
    set @sql = '[' + @sql + ']'
    exec ('select * from (select * from tb) a pivot (max(分数) for 姓名 in (' + @sql + ')) b')
    其中 sql2000 中的max 在这里的含义什么