22,181
社区成员




select
名称,
课程,
[1月]=max(case 日期 when '1月' then 成绩 end),
[2月]=max(case 日期 when '2月' then 成绩 end),
[3月]=max(case 日期 when '3月' then 成绩 end)
from
(select 名称,'数学' 课程,数学 成绩,日期 from @t
union all select 名称,'语文',语文,日期 from @t
union all select 名称,'英语',英语,日期 from @t
union all select 名称,'历史',历史,日期 from @t
union all select 名称,'地理',地理,日期 from @t
union all select 名称,'政治',政治,日期 from @t
) tb
group by 名称,课程
order by 名称,课程
楼上各位在查询的时候都只用到一条语句,INSERT是建测试表用的.create table tb(序号 int,名称 nvarchar(10), 数学 int, 语文 int,英语 int,历史 int, 地理 int,政治 int, 日期 nvarchar(10))
insert into tb values(1 , N'张无' , 80 , 90 , 90 , 80 , 90 , 90 , N'1月')
insert into tb values(2 , N'张无' , 70 , 90 , 50 , 80 , 60 , 80 , N'2月')
insert into tb values(3 , N'张无' , 80 , 90 , 80 , 60 , 80 , 60 , N'3月')
insert into tb values(4 , N'张六' , 80 , 90 , 90 , 80 , 90 , 90 , N'1月')
insert into tb values(5 , N'张六' , 70 , 90 , 50 , 80 , 60 , 80 , N'2月')
insert into tb values(6 , N'张六' , 80 , 90 , 80 , 60 , 80 , 60 , N'3月')
insert into tb values(7 , N'张起' , 80 , 90 , 90 , 80 , 90 , 90 , N'1月')
insert into tb values(8 , N'张起' , 70 , 90 , 50 , 80 , 60 , 80 , N'2月')
insert into tb values(9 , N'张起' , 80 , 90 , 80 , 60 , 80 , 60 , N'3月')
go
select 序号 = row_number() over(order by 名称 , 课程) , * from (select * from (select 名称 , 课程 , 日期,分数 from tb unpivot (分数 for 课程 in([数学] , [语文] , [英语] , [历史] , [地理] , [政治])) t) m) a pivot (max(分数) for 日期 in ([1月],[2月],[3月])) b
drop table tb
/*
序号 名称 课程 1月 2月 3月
-------------------- ---------- -------------------------------------------------------------------------------------------------------------------------------- ----------- ----------- -----------
1 张六 历史 80 80 60
2 张六 地理 90 60 80
3 张六 政治 90 80 60
4 张六 数学 80 70 80
5 张六 英语 90 50 80
6 张六 语文 90 90 90
7 张无 历史 80 80 60
8 张无 地理 90 60 80
9 张无 政治 90 80 60
10 张无 数学 80 70 80
11 张无 英语 90 50 80
12 张无 语文 90 90 90
13 张起 历史 80 80 60
14 张起 地理 90 60 80
15 张起 政治 90 80 60
16 张起 数学 80 70 80
17 张起 英语 90 50 80
18 张起 语文 90 90 90
(18 行受影响)
*/