2016-07-26 2 views
1

У меня есть следующие (плохо структурированные) таблицы:Объединение нескольких строк в вложенном выберите

tbl.quotes A 
quoteid | assignedID | created_by | name 
int, int, varchar, varchar 

tbl.quote_notes B 
id | quoteID | userID | noteText 
int, int, varchar, text 

tbl.admins C 
id | name 
int, varchar 

tbl.agents D 
id | name 
int, varchar 

У меня есть следующий запрос, но мне нужно, чтобы объединить несколько строк для каждого quote_notes.noteText каждого результата для котировок ,

SELECT 
    A.quoteid, 
    A.name, 
    C.name, 
    D.name, 
    (SELECT 
     TOP 1 notetext 
    FROM quote_notes B 
    WHERE B.quoteid = A.quoteid 
    ORDER BY dateentered DESC 
    ) AS [notes] 
    FROM quotes A 
    LEFT JOIN admins C 
     ON A.assignedid = C.id 
    LEFT JOIN agents D 
     ON A.created_by = D.id 
WHERE A.createuserid = 'agentname' 

Это дает и не совмещают quote_notes.noteText несколько строк:

12345 | Quote Name | Admin Name | Agent Name | Notes 

Желаемый результат:

12345 | Quote Name | Admin Name | Agent Name | Note1, Note2, Note3 

Я был написал время цикла для объединения строк, но не может получить он должен работать внутри вложенного оператора select, поскольку он использует переменные. Он также работает только с 1 цитатой

DECLARE @rowcount INTEGER 
DECLARE @Count INTEGER 
DECLARE @note VARCHAR(MAX) 
SET @Count = 1 
SET @note = '' 
SET @rowcount = (SELECT COUNT(quoteID) FROM quote_notes WHERE quoteID = '12345') 

WHILE @Count<[email protected] 
    BEGIN 
    IF @note!='' 
     SET @note = @note+',' + (SELECT convert(varchar(max), noteText) FROM quote_notes WHERE id = @Count) 
    ELSE 
     SET @note = (SELECT noteText FROM quote_notes WHERE id = @Count) 
    SET @[email protected]+1 
    END 
SELECT @note AS note 

Любая помощь будет оценена, спасибо!

+0

Ваш запрос не соответствует определения таблицы. Пожалуйста исправьте. – Serg

+0

@Serg Мои извинения, я попытался вырезать длинные имена таблиц для удобства чтения. Я считаю, что теперь все они подходят. – evade

+1

См. Http://stackoverflow.com/questions/31211506/how-stuff-and-for-xml-path-work-in-sql-server – Serg

ответ

3

Используется для XML Path ..

SELECT 
    A.quoteid, 
    A.name, 
    C.name, 
    D.name, 
     STUFF((SELECT 
     ',' +notetext 
    FROM quote_notes B 
    WHERE B.quoteid = A.quoteid 
    for xml path('') 
    ),1,1,'') 
    AS [notes] 
    FROM quotes A 
    LEFT JOIN admins C 
     ON A.assignedid = C.id 
    LEFT JOIN agents D 
     ON A.created_by = D.id 
WHERE A.createuserid = 'agentname' 
Смежные вопросы