Sql server 从列表到网格的SQL结果集
我已经加入了两个数据表Sql server 从列表到网格的SQL结果集,sql-server,sql-server-2008,list,grid,resultset,Sql Server,Sql Server 2008,List,Grid,Resultset,我已经加入了两个数据表 Student UPN | Name 及 我编写了以下查询,以显示所有值的列表 SELECT student.upn, subject, result FROM student JOIN subject ON subject.upn = student.upn 这将导致以下结果 UPN Subject Result 8152760 English
Student
UPN | Name
及
我编写了以下查询,以显示所有值的列表
SELECT student.upn,
subject,
result
FROM student
JOIN subject
ON subject.upn = student.upn
这将导致以下结果
UPN Subject Result
8152760 English 3c
8138130 Spanish 2b
8152760 Spanish 3c
8128500 English 3c
8152760 Mathematics 2b
8152760 French 2b
我想做的是让resultset为每个不同的学生显示每个主题的一列,因此如下所示:
UPN English French Mathematics Spanish
8152760 3c 2b 2b 3c
8138130 NULL NULL NULL 2b
8128500 3c NULL NULL NULL
理想情况下,我希望它能根据我的主题名称自动生成列,但如果这更简单,我很乐意硬编码它们。给你:
declare @t as table (UPN int, Subject varchar(50), Result varchar(3))
insert into @t values(8152760, 'English' , '3c')
insert into @t values(8138130, 'Spanish' , '2b')
insert into @t values(8152760, 'Spanish' , '3c')
insert into @t values(8128500, 'English' , '3c')
insert into @t values(8152760, 'Mathematics' , '2b')
insert into @t values(8152760, 'French' , '2b')
select distinct t.upn,
e.Result as Enlish,
s.Result as Spanish,
f.Result as French,
m.Result as Mathematics
from @t t
left join @t e on e.UPN = t.upn and e.Subject = 'English'
left join @t s on s.UPN = t.upn and s.Subject = 'Spanish'
left join @t f on f.UPN = t.upn and f.Subject = 'French'
left join @t m on m.UPN = t.upn and m.Subject = 'Mathematics'
PIVOT
version仅适用于聚合,这就是我删除注释的原因)
@谢谢你的帮助。尽管你的评论到哪里去了?这太棒了@rudym。唯一的问题是我的resultset不限于示例中指定的值。是否可以将insert从特定值更改为列名引用?您可以动态生成执行字符串并执行它。像
Declare@sql1 varchar(max)Declare@sql2 varchar(max)Select@sql1='long string'Select@sql2='long string part 2'exec(@sql1+@sql2)
declare @t as table (UPN int, Subject varchar(50), Result varchar(3))
insert into @t values(8152760, 'English' , '3c')
insert into @t values(8138130, 'Spanish' , '2b')
insert into @t values(8152760, 'Spanish' , '3c')
insert into @t values(8128500, 'English' , '3c')
insert into @t values(8152760, 'Mathematics' , '2b')
insert into @t values(8152760, 'French' , '2b')
select distinct t.upn,
e.Result as Enlish,
s.Result as Spanish,
f.Result as French,
m.Result as Mathematics
from @t t
left join @t e on e.UPN = t.upn and e.Subject = 'English'
left join @t s on s.UPN = t.upn and s.Subject = 'Spanish'
left join @t f on f.UPN = t.upn and f.Subject = 'French'
left join @t m on m.UPN = t.upn and m.Subject = 'Mathematics'
SELECT UPN,
[English] ,
[Spanish] ,
[Mathematics] ,
[French]
FROM
(SELECT UPN, Subject, Result
FROM @t) AS SourceTable
PIVOT
(
count(Result)
FOR Subject IN ([English] ,
[Spanish] ,
[Mathematics] ,
[French])
) AS PivotTable;