我有一个具有这种结构的表。
UserID | UserName | AnswerToQuestion1 | AnswerToQuestion2 | AnswerToQuestion3 1 | John | 1 | 0 | 1 2 | Mary | 1 | 1 | 0
我无法弄清楚我将使用哪种SQL查询来获得这样的结果集:
UserID | UserName | QuestionName | Response 1 | John | AnswerToQuestion1 | 1 1 | John | AnswerToQuestion2 | 0 1 | John | AnswerToQuestion3 | 1 2 | Mary | AnswerToQuestion1 | 1 2 | Mary | AnswerToQuestion2 | 1 2 | Mary | AnswerToQuestion3 | 0
我正在尝试将三列分为三个单独的行。这可能吗?
SELECT Y.UserID, Y.UserName, QuestionName = ‘AnswerToQuestion’ + X.Which, Response = CASE X.Which WHEN ‘1’ THEN AnswerToQuestion1 WHEN ‘2’ THEN AnswerToQuestion2 WHEN ‘3’ THEN AnswerToQuestion3 END FROM YourTable Y CROSS JOIN (SELECT ‘1’ UNION ALL SELECT ‘2’ UNION ALL SELECT ‘3’) X (Which)
这对UNPIVOT的性能同样好(有时更好),并且在SQL 2000中也可以工作。
我利用了问题的相似性来创建QuestionName列,但是当然这将适用于不同的问题名称。
请注意,如果问题列表很长或问题名称很长,则可以在X表中尝试两列,一列用于问题编号,一列用于问题名称。或者,如果您已经有了一个包含问题列表的表格,则交叉加入该表格。如果某些问题为NULL,那么最简单的方法是将上述查询放入CTE或派生表中,然后添加WHEREResponse IS NOT NULL。
WHEREResponse IS NOT NULL