假设有张学生成绩表(t)如下:
name subject result
张三 语文73
张三 数学83
张三 物理93
李四 语文74
李四 数学84
李四 物理94
想变成
姓名 语文 数学 物理
张三 738393
李四 748494
代码
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
如果上述两表互相换一下:即
姓名 语文 数学 物理
张三 738393
李四 748494
想变成
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 行)
中国足彩网信息请查看IT技术专栏
2025国考·省考课程试听报名