2012-05-21 40 views
0

我有以下的數據庫設計:即使沒有參與者在其中之一,如何顯示所有答案?

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 

每個問題都有不同的多種選擇。大多數問題具有相同的選擇,如(同意,不同意)。我想編寫一個查詢,顯示所有選擇的問題以及每個選擇中的參與者數量,即使它是零。 我寫了查詢,它顯示了問題的所有答案,即使沒有人選擇其中一個答案,但查詢在除了沒有參與者的答案之外的問題列中顯示NULL,我不知道爲什麼。請幫忙嗎?

我的查詢:

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 

UPDATE:

查詢應顯示在所有的答案的問題,各部門的參與者的數量,所以該怎麼做?

我的更新查詢:

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 

但它的問題不顯示的部門。它應該顯示每個問題中每個部門的參與者數量及其所有答案,即使沒有參與者提供答案之一。

回答

3

QuestionAnswers是獲得答案所需的表,而是因爲你使用的是INNER JOIN從CompleteSurvey到QuestionAnswers你消除在CompleteSurvey沒有相應的行QuestionAnswers所有行。我認爲如果您將它們之間的連接更改爲RIGHT OUTER,這將起作用。

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 

然而我建議切換你是加盟一輪的順序,以下將消除一個OUTER JOIN,這在整體上不執行以及內部連接。它也(在我的選擇中)使得在使用LEFT JOIN而不是右連接時更容易閱讀查詢。

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 

更新的要求

如果我理解正確的要求,你只需要加入的員工和部門對問題答案來獲取部門。這可以通過左連接兩次完成,但是我已經將它移到子查詢中,除了我喜歡在所需的位置使用INNER JOIN之外,沒有其他原因,所以如果有方法我可以重新排列具有較少OUTER JOIN的查詢,我會做它:

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 
+0

感謝您的幫助。對此,我真的非常感激。但是,我得到了與此查詢相關的新要求,我無法在您的查詢中執行此操作。您能否看到我上面更新的問題? – user1395782

+0

謝謝,但它不適用於我,我不知道爲什麼。你能測試你的查詢嗎? – user1395782

+0

我添加了我正在處理的更新查詢,但仍未向我提供結果。 – user1395782

相關問題