Sql 即使其中一个答案中没有参与者,如何显示所有答案?

Sql 即使其中一个答案中没有参与者,如何显示所有答案?,sql,sql-server-2008-r2,Sql,Sql Server 2008 R2,我有以下数据库设计: Employee Table: EmployeeID, Name, OrgCode Department Table: OrgCode, DepartName CompleteSurvey Table: ID, RespondantID, QuestionsAnswersID Questions Table: QuestionID, Question Answers Table: AnswerID, Answer QuestionsAnswers Table: ID, Qu

我有以下数据库设计:

Employee Table: EmployeeID, Name, OrgCode
Department Table: OrgCode, DepartName
CompleteSurvey Table: ID, RespondantID, QuestionsAnswersID
Questions Table: QuestionID, Question
Answers Table: AnswerID, Answer
QuestionsAnswers Table: ID, QuestionID, AnswerID
每个问题都有不同的多项选择。大多数问题都有相同的选择,例如(同意,不同意)。我想写一个查询,显示问题及其所有选项,以及每个选项中的参与者数量,即使它为零我编写了查询,即使没有人选择其中一个答案,它也会显示该问题的所有答案,但除了没有参与者的答案之外,查询在“问题”列中显示为空,我不知道原因。需要帮忙吗

我的问题是:

SELECT     COUNT(DISTINCT dbo.CompleteSurvey.RespondantID) AS [Total Number of Participants], dbo.Answers.Answer, dbo.Questions.Question
FROM         dbo.CompleteSurvey INNER JOIN
                      dbo.QuestionsAnswers ON dbo.CompleteSurvey.QuestionsAnswersID = dbo.QuestionsAnswers.ID INNER JOIN
                      dbo.Questions ON dbo.QuestionsAnswers.QuestionID = dbo.Questions.QuestionID RIGHT OUTER JOIN
                      dbo.Answers ON dbo.QuestionsAnswers.AnswerID = dbo.Answers.AnswerID
GROUP BY dbo.Answers.Answer, dbo.Questions.Question
更新:

查询应显示问题中每个部门的参与者人数及其所有答案,那么如何做到这一点?

我的最新查询:

SELECT     COUNT(DISTINCT dbo.CompleteSurvey.RespondantID) AS [Total Number of Participants], dbo.Answers.Answer, dbo.Questions.Question, 
                      dbo.Departments.DepartmentName
FROM         dbo.Employees INNER JOIN
                      dbo.CompleteSurvey ON dbo.Employees.EmployeeID = dbo.CompleteSurvey.RespondantID INNER JOIN
                      dbo.Departments ON dbo.Employees.OrgCode = dbo.Departments.OrgCode RIGHT OUTER JOIN
                      dbo.Questions INNER JOIN
                      dbo.QuestionsAnswers ON dbo.Questions.QuestionID = dbo.QuestionsAnswers.QuestionID INNER JOIN
                      dbo.Answers ON dbo.QuestionsAnswers.AnswerID = dbo.Answers.AnswerID ON dbo.CompleteSurvey.QuestionsAnswersID = dbo.QuestionsAnswers.ID
GROUP BY dbo.Answers.Answer, dbo.Questions.Question, dbo.Departments.DepartmentName

但它的问题并没有显示出部门。它应该显示每个问题及其所有答案中每个部门的参与者人数,即使其中一个答案中没有参与者。

问题答案是获得答案所需的表格,但是,由于您使用的是从CompleteSurvey到QuestionAnswers的
内部联接,因此您删除了QuestionAnswers中的所有行,而CompleteSurvey中没有相应的行。我认为如果您将它们之间的连接更改为
右外部
,这将起作用

SELECT  COUNT(DISTINCT dbo.CompleteSurvey.RespondantID) AS [Total Number of Participants], 
        dbo.Answers.Answer, 
        dbo.Questions.Question
FROM    dbo.CompleteSurvey 
        RIGHT OUTER JOIN dbo.QuestionsAnswers 
            ON dbo.CompleteSurvey.QuestionsAnswersID = dbo.QuestionsAnswers.ID 
        INNER JOIN dbo.Questions 
            ON dbo.QuestionsAnswers.QuestionID = dbo.Questions.QuestionID 
        RIGHT OUTER JOIN dbo.Answers 
            ON dbo.QuestionsAnswers.AnswerID = dbo.Answers.AnswerID
GROUP BY dbo.Answers.Answer, dbo.Questions.Question
但是我建议您切换加入轮的顺序,下面的操作将消除一个外部联接,总体上来说,外部联接的性能不如内部联接。当使用左连接而不是右连接时,它还(在我的选项中)使查询更易于阅读

SELECT  COUNT(DISTINCT dbo.CompleteSurvey.RespondantID) AS [Total Number of Participants], 
        dbo.Answers.Answer, 
        dbo.Questions.Question
FROM    dbo.Questions
        INNER JOIN dbo.QuestionAnswers
            ON Questions.QuestionID = QuestionAnswers.QuestionID
        INNER JOIN dbo.Answers
            ON QuestionAnswers.AnswerID = Answers.AnswerID
        LEFT JOIN dbo.CompleteSurvey
            ON QuestionAnswers.QuestionAnswersID = CompleteSurvey.QuestionAnswersID
GROUP BY Answers.Answer, Questions.Question

更新的要求

如果我正确理解了要求,您只需加入员工和部门,回答问题即可获得部门。这可以通过两次左连接来完成,但是我将其移动到子查询,原因无非是我喜欢在可以的地方使用内部连接,因此如果有一种方法可以用较少的外部连接重新排列查询,我将这样做:

SELECT  COUNT(DISTINCT CompleteSurvey.RespondantID) AS [Total Number of Participants], 
        Answers.Answer, 
        Questions.Question,
        DepartName
FROM    dbo.Questions
        INNER JOIN dbo.QuestionsAnswers
            ON Questions.QuestionID = QuestionsAnswers.QuestionID
        INNER JOIN dbo.Answers
            ON QuestionsAnswers.AnswerID = Answers.AnswerID
        CROSS JOIN Departments
        LEFT JOIN 
        (   SELECT  OrgCode, QuestionsAnswersID, RespondantID
            FROM    dbo.CompleteSurvey
                    INNER JOIN dbo.Employees
                        ON EmployeeID = RespondantID
        ) CompleteSurvey
            ON QuestionsAnswers.ID = CompleteSurvey.QuestionsAnswersID
            AND Departments.OrgCode = CompleteSurvey.OrgCode
GROUP BY Answers.Answer, Questions.Question, DepartName
ORDER BY Questions.Question, Answers.Answer, DepartName

QuestionAnswers是获取答案所需的表格,但由于您使用的是从CompleteSurvey到QuestionAnswers的
内部联接,因此您删除了QuestionAnswers中的所有行,而CompleteSurvey中没有相应的行。我认为如果您将它们之间的连接更改为
右外部
,这将起作用

SELECT  COUNT(DISTINCT dbo.CompleteSurvey.RespondantID) AS [Total Number of Participants], 
        dbo.Answers.Answer, 
        dbo.Questions.Question
FROM    dbo.CompleteSurvey 
        RIGHT OUTER JOIN dbo.QuestionsAnswers 
            ON dbo.CompleteSurvey.QuestionsAnswersID = dbo.QuestionsAnswers.ID 
        INNER JOIN dbo.Questions 
            ON dbo.QuestionsAnswers.QuestionID = dbo.Questions.QuestionID 
        RIGHT OUTER JOIN dbo.Answers 
            ON dbo.QuestionsAnswers.AnswerID = dbo.Answers.AnswerID
GROUP BY dbo.Answers.Answer, dbo.Questions.Question
但是我建议您切换加入轮的顺序,下面的操作将消除一个外部联接,总体上来说,外部联接的性能不如内部联接。当使用左连接而不是右连接时,它还(在我的选项中)使查询更易于阅读

SELECT  COUNT(DISTINCT dbo.CompleteSurvey.RespondantID) AS [Total Number of Participants], 
        dbo.Answers.Answer, 
        dbo.Questions.Question
FROM    dbo.Questions
        INNER JOIN dbo.QuestionAnswers
            ON Questions.QuestionID = QuestionAnswers.QuestionID
        INNER JOIN dbo.Answers
            ON QuestionAnswers.AnswerID = Answers.AnswerID
        LEFT JOIN dbo.CompleteSurvey
            ON QuestionAnswers.QuestionAnswersID = CompleteSurvey.QuestionAnswersID
GROUP BY Answers.Answer, Questions.Question

更新的要求

如果我正确理解了要求,您只需加入员工和部门,回答问题即可获得部门。这可以通过两次左连接来完成,但是我将其移动到子查询,原因无非是我喜欢在可以的地方使用内部连接,因此如果有一种方法可以用较少的外部连接重新排列查询,我将这样做:

SELECT  COUNT(DISTINCT CompleteSurvey.RespondantID) AS [Total Number of Participants], 
        Answers.Answer, 
        Questions.Question,
        DepartName
FROM    dbo.Questions
        INNER JOIN dbo.QuestionsAnswers
            ON Questions.QuestionID = QuestionsAnswers.QuestionID
        INNER JOIN dbo.Answers
            ON QuestionsAnswers.AnswerID = Answers.AnswerID
        CROSS JOIN Departments
        LEFT JOIN 
        (   SELECT  OrgCode, QuestionsAnswersID, RespondantID
            FROM    dbo.CompleteSurvey
                    INNER JOIN dbo.Employees
                        ON EmployeeID = RespondantID
        ) CompleteSurvey
            ON QuestionsAnswers.ID = CompleteSurvey.QuestionsAnswersID
            AND Departments.OrgCode = CompleteSurvey.OrgCode
GROUP BY Answers.Answer, Questions.Question, DepartName
ORDER BY Questions.Question, Answers.Answer, DepartName

谢谢你的帮助。我真的很感激。但是,我得到了一个与此查询相关的新需求,我无法在您的查询中完成它。你能看看我上面更新的问题吗?谢谢,但我不知道为什么。你能测试一下你的查询吗?我添加了我正在处理的更新的查询,但仍然没有向我提供结果。我已经更新了修改后的答案,以便它可以运行。但是,它返回的结果与您提供的查询相同。你说的“不给我结果”是什么意思。您可以更具体地说明它的错误之处吗?它在部门名称字段中仍然显示空值。我想列出第一个部门,例如A部门,并显示问题的答案,并显示每个答案中的参与者人数。然后,它应该是第二部门等等。可能吗?谢谢你的帮助。我真的很感激。但是,我得到了一个与此查询相关的新需求,我无法在您的查询中完成它。你能看看我上面更新的问题吗?谢谢,但我不知道为什么。你能测试一下你的查询吗?我添加了我正在处理的更新的查询,但仍然没有向我提供结果。我已经更新了修改后的答案,以便它可以运行。但是,它返回的结果与您提供的查询相同。你说的“不给我结果”是什么意思。您可以更具体地说明它的错误之处吗?它在部门名称字段中仍然显示空值。我想列出第一个部门,例如A部门,并显示问题的答案,并显示每个答案中的参与者人数。然后,它应该是第二部门等等。可能吗?