2013-06-21 2 views
0

Действительно ли это SQL, чтобы добавить значения столбца для нескольких записей в один результат строки?Добавить значения столбцов из нескольких строк в строку

DECLARE @Result NVARCHAR(MAX) 
SET @Result = '' 

SELECT @Result = @Result + Answer + ';' 
FROM Answers A 
WHERE A.Quiz_ID = 1 AND A.Question_Id = 1 
ORDER BY Answer 

Select @Result [List Of Answers] 

Результат должен выглядеть следующим образом:

Can You Repeat The Question;No;Yes; 

Это всего лишь пример. Мой вопрос в том, действительно ли это SQL? Причина, по которой я спрашиваю, заключается в том, что эта техника, похоже, ломается в моем реальном коде с большим количеством объединений и предложением ORDER BY. В моем «реальном» коде я получаю только значение из одной строки.

+3

вы пытались запустить его? –

ответ

3

Для достижения своей цели вам нужно использовать выход STUFF() и GROUP BY

SELECT q.Question + ';' + 
     STUFF((SELECT ';' + Answer 
       FROM Answers 
       WHERE Question_Id = q.Question_Id 
       ORDER BY 1 
       FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)'),1,1,'') result 
    FROM Questions q LEFT JOIN Answers a 
    ON q.Question_Id = a.Question_Id 
GROUP BY q.Question_Id, q.Question 

Пример:

 
|          RESULT | 
----------------------------------------------- 
| Can You Repeat The Question;Maybe;No;Yes | 
| Can You Really Repeat The Question;Sure;Yes | 

Вот SQLFiddle демо

Если есть возможность иметь вопросы без ответов, назначенных еще, и вы хотите правильно показать t hem вы можете использовать ISNULL() или COALESCE() (например. чтобы ввести значение по умолчанию) Выход

SELECT q.Question + ';' + 
     ISNULL(STUFF((SELECT ';' + Answer 
       FROM Answers 
       WHERE Question_Id = q.Question_Id 
       ORDER BY 1 
       FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)'),1,1,''), 
     '[Sorry, no answers yet]') result 
    FROM Questions q LEFT JOIN Answers a 
    ON q.Question_Id = a.Question_Id 
    GROUP BY q.Question_Id, q.Question 

Пример:

 
|             RESULT | 
---------------------------------------------------------- 
|    Can You Repeat The Question;Maybe;No;Yes | 
|   Can You Really Repeat The Question;Sure;Yes | 
| Can a question have no answers;[Sorry, no answers yet] | 

Вот SQLFiddle демо

+0

+1 - за хороший ответ. – Devart

+0

Спасибо за демоверсию SQLFiddle – BrianK

+0

@BrianK Вы более чем рады :) Удачи. – peterm