(SQL) 一行查询结果
(SQL) Query Results on one row
所以我有两个表,名为 "Questions" 和 Answers
我为那两个表创建了 INNER JOIN
SELECT Questions.ID, Questions.QText, Answers.AText
FROM Questions INNER JOIN Answers
ON Questions.ID=Answers.QuestionID;
结果如下所示:
但是,您可以清楚地看到,每次显示 4 次问题和其中一个答案。
现在我的问题是:是否可以将结果排成一行,由
组成
[ID]-[问题]-[答案1]-[答案2]-[答案3]-[答案4]
要将问题的所有答案都放在一行中使用 COALESCE
:
DECLARE @Answer VARCHAR(8000)
SELECT Questions.ID, Questions.QText, @Answer = COALESCE(@Answer + ', ', '') + AText
FROM Questions INNER JOIN Answers ON Questions.ID=Answers.QuestionID
WHERE AText IS NOT NULL
如果您使用的是 SQL Server 2005,您可以使用 FOR XML PATH 命令。
SELECT Questions.ID, Questions.QText,
(STUFF((SELECT CAST(', ' + [AText] AS VARCHAR(MAX))
FROM Answers
WHERE Questions.ID = Answers.QuestionID
FOR XML PATH ('')), 1, 2, '')) AS Answers
FROM Questions
对 CSV 使用 CROSS APPLY。不要内联,那么你需要一个分组...
SELECT q.ID, q.QText, Answers = STUFF(x.csv, 1, 1, '')
FROM Questions q
CROSS APPLY
(
SELECT
'-' + a.Atext
FROM
Answers a
WHERE
a.QuestionID = q.ID
FOR XML PATH ('')
) x (csv)
您可以将此查询用于数据透视表:
SELECT QID, QText, [1], [2], [3], [4]
FROM (SELECT Q.ID AS QID, A.ID AS AID, Q.QText, A.AText FROM Questions AS Q
INNER JOIN Answers AS A ON Q.ID = A.QuestionID) QA
PIVOT
(
MAX(AText)
FOR AID
IN ([1], [2], [3], [4])
) AS PV
但是:您的答案必须使用组合主键 Table。
对于这个 Pivot Table,答案 ID 每次都必须是 1、2、3、4。否则你得不到答案。
FOR AID
声明,哪个列用于此。
否则,您可以在名为 "AnswerNr" 或类似名称的答案中添加一列。在此列中,您输入 1 到 4 作为您的答案并将查询更改为:
SELECT QID, QText, [1], [2], [3], [4]
FROM (SELECT Q.ID AS QID, ->A.AnswerNr<-, Q.QText, A.AText FROM Questions AS Q
INNER JOIN Answers AS A ON Q.ID = A.QuestionID) QA
PIVOT
(
MAX(AText)
FOR ->AnswerNr<-
IN ([1], [2], [3], [4])
) AS PV
所以我有两个表,名为 "Questions" 和 Answers
我为那两个表创建了 INNER JOIN
SELECT Questions.ID, Questions.QText, Answers.AText
FROM Questions INNER JOIN Answers
ON Questions.ID=Answers.QuestionID;
结果如下所示:
现在我的问题是:是否可以将结果排成一行,由
组成[ID]-[问题]-[答案1]-[答案2]-[答案3]-[答案4]
要将问题的所有答案都放在一行中使用 COALESCE
:
DECLARE @Answer VARCHAR(8000)
SELECT Questions.ID, Questions.QText, @Answer = COALESCE(@Answer + ', ', '') + AText
FROM Questions INNER JOIN Answers ON Questions.ID=Answers.QuestionID
WHERE AText IS NOT NULL
如果您使用的是 SQL Server 2005,您可以使用 FOR XML PATH 命令。
SELECT Questions.ID, Questions.QText,
(STUFF((SELECT CAST(', ' + [AText] AS VARCHAR(MAX))
FROM Answers
WHERE Questions.ID = Answers.QuestionID
FOR XML PATH ('')), 1, 2, '')) AS Answers
FROM Questions
对 CSV 使用 CROSS APPLY。不要内联,那么你需要一个分组...
SELECT q.ID, q.QText, Answers = STUFF(x.csv, 1, 1, '')
FROM Questions q
CROSS APPLY
(
SELECT
'-' + a.Atext
FROM
Answers a
WHERE
a.QuestionID = q.ID
FOR XML PATH ('')
) x (csv)
您可以将此查询用于数据透视表:
SELECT QID, QText, [1], [2], [3], [4]
FROM (SELECT Q.ID AS QID, A.ID AS AID, Q.QText, A.AText FROM Questions AS Q
INNER JOIN Answers AS A ON Q.ID = A.QuestionID) QA
PIVOT
(
MAX(AText)
FOR AID
IN ([1], [2], [3], [4])
) AS PV
但是:您的答案必须使用组合主键 Table。
对于这个 Pivot Table,答案 ID 每次都必须是 1、2、3、4。否则你得不到答案。
FOR AID
声明,哪个列用于此。
否则,您可以在名为 "AnswerNr" 或类似名称的答案中添加一列。在此列中,您输入 1 到 4 作为您的答案并将查询更改为:
SELECT QID, QText, [1], [2], [3], [4]
FROM (SELECT Q.ID AS QID, ->A.AnswerNr<-, Q.QText, A.AText FROM Questions AS Q
INNER JOIN Answers AS A ON Q.ID = A.QuestionID) QA
PIVOT
(
MAX(AText)
FOR ->AnswerNr<-
IN ([1], [2], [3], [4])
) AS PV