SqlServer:游标+Case 实现行列转化

需要转化的表结构/以及数据:

SqlServer:游标+Case 实现行列转化

使用SQl中的Pivot实现

select b.Name,sum(b.地理) 地理,sum(b.英语) 英语,sum(b.语文) 语文,sum(b.数学) 数学 from MCS_TEST.dbo.UserScore a 
pivot(sum(Score) for [Subject] in(数学,语文,英语,地理)) b group by b.Name

SqlServer:游标+Case 实现行列转化

使用 游标+Case语句实现:

declare @sql nvarchar(max),@subject nvarchar(20)
declare autopivot cursor for select distinct([Subject]) from dbo.UserScore
open autopivot
	set @sql='select Name'
	fetch next from autopivot into @subject
	while @@fetch_status=0
	begin
		--print @subject
		set @sql+=',sum(case [Subject] when '''[email protected]+''' then Score else 0 end) '[email protected]+''
		fetch next from autopivot into @subject
	end
	set @sql+=' from UserScore group by Name'
	print @sql
	exec(@sql)
close autopivot
deallocate autopivot

SqlServer:游标+Case 实现行列转化

定义的@sql最终的结果:
 

select Name,sum(case [Subject] when '地理' then Score else 0 end) 地理,sum(case [Subject] when '数学' then Score else 0 end) 数学,sum(case [Subject] when '英语' then Score else 0 end) 英语,sum(case [Subject] when '语文' then Score else 0 end) 语文 from UserScore group by Name