固定列数的行列转换
 如表结构为:    
    如

Name   subject score
---------------------------
张三   语文   80
张三   数学   70
张三   英语   60
李四   语文   90
李四   数学   80
李四   英语   100
....
    转换为 :
               语文   数学   英语
       张三    80     70     60
       李四    90     80    100

求:创建表,源表,表名: Stu , 只用一句sql 得到转换结果。
解答:
方法一 :通过生成临时表的方式操作

select name ,sum(yw) as '语文',sum(sx)  as '数学',sum(wy) as '英语'
from(
select name ,
CASE subject WHEN '语文' THEN score END AS yw,
CASE subject WHEN '数学' THEN score END AS sx,
CASE subject WHEN '英语' THEN score END AS wy
from  Stu
) tempStu
group by name

方法二:课程只有语文、数学、物理这三门课程则可以使用静态sql 来实现  Sql2000

select name as 姓名,
  max(case subject when '语文' then score else 0 end) 语文,
  max(case subject when '数学' then score else 0 end) 数学,
  max(case subject when '英语' then score else 0 end) 英语
from Stu
group by name

方法三:如果课程不止语文、数学、物理这三门课程 则可以使用动态sql 来实现
      创建一个用户变量,使用简单的T-SQL来实现。 Sql2000

declare @sql varchar(8000)     --声明一个变量
set @sql = 'select name as 姓名'
select @sql = @sql + ' , max(case subject when ''' + subject+ ''' then score  else 0 end) [' + subject+ ']'
from (select distinct subject from Stu) as a
set @sql = @sql + ' from Stu group by name'
print @sql   --打印生成的sql
exec(@sql)   --执行该sql
注: case when的作用就是一个条件选择语句,根据不同的要求显示不同的内容,格式是这样的case
      when [选择条件]
      then [结果1]
      else [结果2]
      end
  其中[选择条件]也可以放在case之后。
                 CASE WHEN语句在DB2,ORACLE,SQL SERVER系列,SYBASE等大型数据库都受到支持,是标准的SQL语句