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;