小编典典

将多列拆分为多行

sql

我有一个具有这种结构的表。

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

我正在尝试将三列分为三个单独的行。这可能吗?


阅读 194

收藏
2021-03-23

共1个答案

小编典典

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

2021-03-23