1.首先列转行:

/*问题:假设有张学生成绩表(tb)如下:
姓名 课程 分数
张三 语文 74
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94
想变成(得到如下结果): 
姓名 语文 数学 物理 
---- ---- ---- ----
李四 74   84   94
张三 74   83   93
-------------------*/

Create table tb(
  _name varchar(40),
  course varchar(40),
  score 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')

--select * from tb
--静态的方法
select _name,
Max(case when course='语文' then score else 0 end) as 语文,
Max(case when course='数学' then score else 0 end) as 数学,
Max(case when course='物理' then score else 0 end) as 物理
from tb
group by _name
--动态方法
declare @sql varchar(8000)
set @sql = 'select _name '
select @sql = @sql + ',Max(case course when '''+course+''' then course else 0 end)['+course+']'
from (select distinct course from tb) as a
set @sql = @sql + ' from tb group by _name '
exec(@sql)

 2.行转列:

create table tb
(
          _name varchar(40) ,
          _language int ,
          _math int , 
          _poly int
)
insert into tb values('张三',74,83,93)
insert into tb values('李四',74,84,94)

--select * from tb
--静态方法
select * from
(
 select 姓名 , 课程 = '语文' , 分数 = 语文 from tb 
 union all
 select 姓名 , 课程 = '数学' , 分数 = 数学 from tb
 union all
 select 姓名 , 课程 = '物理' , 分数 = 物理 from tb
) t
order by 姓名
--动态方法
declare @sql varchar(8000)
select @sql = Isnull(@sql + ' union all ','') + ' select _name, [course]='+quotename(Name,'''')+',[score]='+quotename(name)+' from tb'
from syscolumns
where name!=N'_name' and id = object_id('tb')
order by colid asc
exec(@sql + ' order by _name')