针对下面的第一张result表中的数据,想要找到sid对应的每个course的分数,每个sid一行。这就需要行转列了。

行转列数据图

首先建立测试的表和数据:

create table course (id int, name nvarchar(100))
create table result (id int, sid varchar(16), course nvarchar(100), score int)
insert into course values(1, N'语文')
insert into course values(2, N'数学')
insert into course values(3, N'英语')
insert into result values(1, 2005001, N'语文',      80)
insert into result values(2, 2005001, N'数学',      90)
insert into result values(3, 2005001, N'英语',      80)
insert into result values(4, 2005002, N'语文',      56)
insert into result values(5, 2005002, N'数学',      69)
insert into result values(6, 2005002, N'英语',      89)

运行行转列的sql句子:

declare @sql varchar(8000)
set @sql='select sid'
select @sql=@sql+','+course.name+'=isnull(sum(case course when '''+course.name+''' then score end),0)'
from course order by id
set @sql=@sql+' from result group by sid order by sid'
print @sql
exec(@sql)

打印的结果:

select sid,语文=isnull(sum(case course when '语文' then score end),0),数学=isnull(sum(case course when '数学' then score end),0),英语=isnull(sum(case course when '英语' then score end),0) from result group by sid order by sid

可以看出,上面的course表其实只是一个工具。

Leave a Reply