SQL行转列
如下:
id sid course result
1 2005001 语文 80.0
2 2005001 数学 90.0
3 2005001 英语 80.0
4 2005002 语文 56.0
5 2005002 数学 69.0
6 2005002 英语 89.0
declare @sql varchar(8000)
set @sql='select sid'
select @sql=@sql+','+course.name+'=isnull(sum(case course when '''+course.name+''' then result end),0)'
from course order by id
set @sql=@sql+' from result group by sid order by sid'
print @sql
exec(@sql)
得出结果
sid 语文 数学 英语
2005001 80.0 90.0 80.0
2005002 56.0 69.0 89.0
如果我要将
id sid course resulta resultb
1 2005001 语文 80.0 100
2 2005001 数学 90.0 90
3 2005001 英语 80.0 70
4 2005002 语文 56.0 80
5 2005002 数学 69.0 85
6 2005002 英语 89.0 80
变成如下格式该如何?
sid 语文resulta 语文resultb 数学resulta... 英语resulta
2005001 80.0 100 90.0 80.0
2005002 56.0 80 69.0 89.0
解决方式:
if not object_id(N'Tempdb..course') is null
drop table course
Go
Create table course([id] int,[sid] int,[course] nvarchar(2),[resulta] decimal(18,1),[resultb] int)
Insert course
select 1,2005001,N'语文',80.0,100 union all
select 2,2005001,N'数学',90.0,90 union all
select 3,2005001,N'英语',80.0,70 union all
select 4,2005002,N'语文',56.0,80 union all
select 5,2005002,N'数学',69.0,85 union all
select 6,2005002,N'英语',89.0,80
Go
declare @sql nvarchar(4000)
select @sql=N'select sid'
select
@sql=@sql+N',['+[course]+N'resulta]=sum(case course when N'''+[course]+''' then [resulta] else 0 end),['+[course]+N'resultb]=sum(case course when N'''+[course]+''' then [resultb] else 0 end)'
from course a
WHERE ID=(SELECT TOP 1 ID FROM [course] WHERE course=a.course)
ORDER BY ID
print @sql
exec(@sql+' from [course] group by [sid]')
/*
sid 语文resulta 语文resultb 数学resulta 数学resultb 英语resulta 英语resultb
2005001 80.0 100 90.0 90 80.0 70
2005002 56.0 80 69.0 85 89.0 80
*/

浙公网安备 33010602011771号