Sql server MS SQL数据透视表:空源

Sql server MS SQL数据透视表:空源,sql-server,pivot,Sql Server,Pivot,我正在尝试做一个SQL透视,当我尝试透视的主表中有数据时,它可以完美地工作。我已将问题简化为用户、主题和结果数据集。我想显示一个表,其中主题为行,用户为列,他们在单元格中对这些主题的结果。它应该显示所有用户(即使他们没有结果),以及所有主题(即使没有结果)。我让它工作,除非根本没有结果,然后它什么也不返回。我希望它仍然显示行和列,但单元格中只显示null,有什么想法吗 请参见SQLFiddle示例 已更新 您需要将查询更改为: set @query = ' Select * From ( SEL

我正在尝试做一个SQL透视,当我尝试透视的主表中有数据时,它可以完美地工作。我已将问题简化为用户、主题和结果数据集。我想显示一个表,其中主题为行,用户为列,他们在单元格中对这些主题的结果。它应该显示所有用户(即使他们没有结果),以及所有主题(即使没有结果)。我让它工作,除非根本没有结果,然后它什么也不返回。我希望它仍然显示行和列,但单元格中只显示null,有什么想法吗

请参见SQLFiddle示例

已更新


您需要将查询更改为:

set @query = '
Select * From (
SELECT Subjects.ID, Subjects.Name, Results.UserID, Results.Result 
from Subjects
Left Outer join Results
On Results.SubjectID = Subjects.ID
) x pivot (max(Result) for UserID in (' + @cols + ')) p'

您需要左外部联接以包括非匹配项。我还交换了各个表,以便将结果连接到主题上,但正如评论中指出的,这是一个偏好问题。关键是你需要选择Subjects.Id而不是Results表中的Id,如果不匹配,它将不会返回任何结果。

那么你想要的输出是什么呢?选择ISNULL(p.subjectid,0),ISNULL(p.Name',),ISNULL(p.UserID),ISNULL(p.ResultFrom,0)(你的代码)在这种情况下我不确定是否遵循@mohan111,我相当确信“A左连接B”和“B右连接A”是等价的。问题很简单,他使用的是SubjectsId而不是ID,这意味着在没有匹配项的情况下他没有ID。没错,但我一直被教导使用left-outer,所以这只是一个偏好问题。我已经编辑了我的答案以引用您的评论。谢谢大家,结果。在制作简化示例时,主题ID实际上是一个输入错误,但它帮助我看到了我的实际代码哪里出了问题,所以谢谢!我的实际代码出于不同的原因(通过要求查找行的特定实例进行分组)交叉引用了同一个表3次,并且一些连接是不可靠的。在把它分解成一个例子的过程中,我明白了为什么它不起作用!