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

アップデート:

クエリには、質問の各部門の参加者の数とそのすべての回答が表示される必要があります。それを行うにはどうすればよいですか。

私の更新されたクエリ:

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

しかし、それに関する問題は部門を示していません。いずれかの回答に参加者がいない場合でも、各質問の各部門の参加者数とすべての回答を表示する必要があります。

4

1 に答える 1

3

QuestionAnswersは回答を取得するために必要なテーブルですが、INNER JOINCompleteSurveyから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

ただし、ラウンドインする順序を切り替えることをお勧めします。以下では、全体としてINNERJOINほどのパフォーマンスを発揮しないOUTERJOINを1つ削除します。また、(私のオプションでは)右結合の代わりに左結合を使用すると、クエリがはるかに読みやすくなります。

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

更新された要件

要件を正しく理解している場合は、従業員と部門に参加して質問回答を取得し、部門を取得する必要があります。これは、2回左結合するだけで実行できますが、可能な限りINNER JOINを使用する以外の理由でサブクエリに移動したので、より少ないOUTERJOINでクエリを再配置できる方法があればやれ:

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
于 2012-05-21T08:51:47.573 に答える