(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