【发布时间】:2019-04-17 21:45:03
【问题描述】:
我需要在一行中列出调查回复。调查回复表列出了 questionID 和 ResponseID(这些是多项选择题),因此每个回复对应一行。有 12 个问题。诸如回复日期、进行调查的工作人员和进入调查的工作人员等信息保存在其他表格中。
所以,我有一个查询,可以将一项调查的回复分成 12 行。现在我需要把所有这些都放在一排。枢轴,对吧?
但我永远无法让它工作。 :-( 从这个论坛和其他论坛尝试了几种解决方案(包括 Mickey 的文档:https://docs.microsoft.com/en-us/sql/t-sql/queries/from-using-pivot-and-unpivot?view=sql-server-2017)。
然后我找到了这个根本不使用枢轴的解决方案,在这里:SQL Pivot Table Grouping
效果很好,但该示例只有两个问题。我们的一些调查将有超过 50 个问题,所以我猜这不会是一个非常优雅的解决方案。
所以我回到我的支点问题。
经验水平介于白痴和新手之间,所以我可能遗漏了一些明显的东西。
这是查询本身(按预期工作):
SELECT AssessmentResponses.ID, AssessmentQuestions.QuestionNumber,
AssessmentResponseAnswers.QuestionID,
AssessmentAnswerChoices.AnswerChoiceNumber
FROM (AssessmentResponses RIGHT JOIN AssessmentResponseAnswers
ON AssessmentResponses.ID = AssessmentResponseAnswers.AssessmentResponseID)
LEFT JOIN (AssessmentQuestions RIGHT JOIN AssessmentAnswerChoices
ON AssessmentQuestions.ID = AssessmentAnswerChoices.AssessmentQuestionID)
ON AssessmentResponseAnswers.AnswerChoiceID = AssessmentAnswerChoices.AnswerChoiceID
WHERE AssessmentResponses.AssessmentID = 1 AND AssessmentResponses.RespondentID = 44;
以下是我尝试使其旋转的方法:
SELECT ID, [1A], [1B], [2A], [2B], [3A], [3B], [4A], [4B], [5A], [5B], [6A], [6B]
FROM (
SELECT AssessmentResponses.ID, AssessmentQuestions.QuestionNumber,
AssessmentResponseAnswers.QuestionID,
AssessmentAnswerChoices.AnswerChoiceNumber
FROM (AssessmentResponses RIGHT JOIN AssessmentResponseAnswers
ON AssessmentResponses.ID = AssessmentResponseAnswers.AssessmentResponseID)
LEFT JOIN (AssessmentQuestions RIGHT JOIN AssessmentAnswerChoices
ON AssessmentQuestions.ID = AssessmentAnswerChoices.AssessmentQuestionID)
ON AssessmentResponseAnswers.AnswerChoiceID = AssessmentAnswerChoices.AnswerChoiceID
WHERE AssessmentResponses.AssessmentID = 1 AND AssessmentResponses.RespondentID = 44
) AS Src
PIVOT
(
MAX(AnswerChoiceNumber)
FOR QuestionNumber IN ([1A], [1B], [2A], [2B], [3A], [3B], [4A], [4B], [5A], [5B], [6A], [6B])
)
AS Pvt;
我希望这会给我 1 行 13 列(ID 加上十二个问题)。但它仍然给了我 12 行:13 列在那里,它只为 12 个问题中的 11 个提供空值。 (在第1行,1A有答案;在第2行,1B有答案,等等)
我错过了什么?
【问题讨论】:
-
我认为您可以删除 azure-sql-database 标记。你的问题不是特定的。您可能会吸引其他响应者,甚至有人可能会为您编写动态 sql 语句,这将比我的回答更灵活,当然还有动态 SQL 的标准警告。
标签: sql sql-server pivot azure-sql-database