-- ①行转列 静态SQL SQL Server2000
select 姓名 as 姓名 ,
max(case 课程 when '语文' then 分数 else 0 end) 语文,
max(case 课程 when '数学' then 分数 else 0 end) 数学,
max(case 课程 when '英语' then 分数 else 0 end) 英语,
max(case 课程 when '化学' then 分数 else 0 end) 化学,
max(case 课程 when '生物' then 分数 else 0 end) 生物,
max(case 课程 when '地理' then 分数 else 0 end) 地理,
max(case 课程 when '政治' then 分数 else 0 end) 政治,
max(case 课程 when '物理' then 分数 else 0 end) 物理
from tbs
group by 姓名;
-- ②行转列 静态SQL SQL Server2005
select * from (select * from tbs) a
pivot
(max(分数) for 课程 in (语文,数学,英语,化学,生物,地理,政治,物理)) b;
-- ③行转列 动态SQL SQL SERVER 2000
declare @sql varchar(2000)
set @sql = 'select 姓名'
select @sql = @sql + ',max(case 课程 when '''+ 课程 + ''' then 分数 else 0 end) ['+ 课程 +'] '
from (select distinct 课程 from tbs) a
set @sql = @sql + 'from tbs group by 姓名'
exec(@sql);
-- ④行转列 动态SQL SQL SERVER 2005
declare @sql varchar(2000)
select @sql = isnull(@sql +'],[' ,'') +课程 from tbs group by 课程
set @sql = '[' + @sql +']'
exec('select * from (select * from tbs) a pivot(max(分数) for 课程 in ('+ @sql +'))b')