DB(数据库版本): MSSQL2008
假设我有每门课每个同学的成绩,按下面第一个表的格式储存。怎么做才能得到后面那张表,即第一个列名仍是course,后面的列名变成每个同学的名字,对应是他们的分数。
例如:表结构:
course name score
1 a 7
1 b 8
1 c 9
2 a 6
2 b 9
2 c 8
2 d 7
3 a 7
3 b 7
3 c 7
3 d 7
期望得到的结果如下:
class a b c d
1 7 8 9 null
2 6 9 8 7
3 7 7 7 7
我是新手,不太清楚该怎么查找这个问题的解法,希望各位前辈能够指点!谢谢!
------解决思路----------------------
行转列问题。
if object_id('tempdb..#tab') is not null
drop table #tab
create table #tab (course int,name varchar(30),score int)
insert into #tab
select 1,'a',7 union all
select 1,'b',8 union all
select 1,'c',9 union all
select 2,'a',6 union all
select 2,'b',9 union all
select 2,'c',8 union all
select 2,'d',7 union all
select 3,'a',7 union all
select 3,'b',7 union all
select 3,'c',7 union all
select 3,'d',7
declare @sql varchar(max)
select @sql=isnull(@sql+',','')+quotename(name,'[') from #tab
group by name
set @sql='select * from #tab pivot (max(score) for name in('+@sql+'))p'
exec (@sql)
------解决思路----------------------
-- drop table #table
create table #table(course int,name nvarchar(20),score int)
go
insert into #table(course,name,score)
values(1,'a',7),(1,'b',8),(1,'c',9)
,(2,'a',6),(2,'b',9),(2,'c',8),(2,'d',7)
,(3,'a',7),(3,'b',7),(3,'c',7),(3,'d',7)
go
--结果
select * from #table pivot(max(score) for name in([a],[b],[c],[d])) as t