日期:2014-05-18 浏览次数:20738 次
普通行列转换 假设有张学生成绩表(t)如下 Name Subject Result 张三 语文 73 张三 数学 83 张三 物理 93 李四 语文 74 李四 数学 84 李四 物理 94 想变成 姓名 语文 数学 物理 张三 73 83 93 李四 74 84 94 create table #t ( Name varchar(10) , Subject varchar(10) , Result int ) insert into #t(Name , Subject , Result) values('张三','语文','73') insert into #t(Name , Subject , Result) values('张三','数学','83') insert into #t(Name , Subject , Result) values('张三','物理','93') insert into #t(Name , Subject , Result) values('李四','语文','74') insert into #t(Name , Subject , Result) values('李四','数学','83') insert into #t(Name , Subject , Result) values('李四','物理','93') declare @sql varchar(8000) set @sql = 'select Name as ' + '姓名' select @sql = @sql + ' , sum(case Subject when ''' + Subject + ''' then Result end) [' + Subject + ']' from (select distinct Subject from #t) as a set @sql = @sql + ' from #t group by name' exec(@sql) drop table #t --结果 姓名 数学 物理 语文 ---------- ----------- ----------- ----------- 李四 83 93 74 张三 83 93 73 ---------------------------------------------------- 如果上述两表互相换一下:即 姓名 语文 数学 物理 张三 73 83 93 李四 74 84 94 想变成 Name Subject Result 张三 语文 73 张三 数学 83 张三 物理 93 李四 语文 74 李四 数学 84 李四 物理 94 create table #t ( 姓名 varchar(10) , 语文 int , 数学 int , 物理 int ) insert into #t(姓名 , 语文 , 数学 , 物理) values('张三',73,83,93) insert into #t(姓名 , 语文 , 数学 , 物理) values('李四',74,84,94) select 姓名 as Name,'语文' as Subject,语文 as Result from #t union select 姓名 as Name,'数学' as Subject,数学 as Result from #t union select 姓名 as Name,'物理' as Subject,物理 as Result from #t order by 姓名 desc drop table #t --结果 Name Subject Result ---------- ------- ----------- 张三 数学 83 张三 物理 93 张三 语文 73 李四 数学 84 李四 物理 94 李四 语文 74 (所影响的行数为 6 行)