2016-07-26 7 views
1

Ich habe die folgenden (schlecht strukturiert) Tabellen:Kombinieren mehrerer Zeilen innerhalb verschachtelt wählen

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 

Ich habe die folgende Abfrage, aber ich muss auf jedes Ergebnis für Angebote, die mehrere Zeilen für jede quote_notes.noteText kombinieren .

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' 

Dies ergibt und quote_notes.noteText mehrere Zeilen nicht kombinieren:

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

Gewünschtes Ergebnis:

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

ich eine While-Schleife hatte, schrieb die Zeilen zu kombinieren, kann aber nicht bekommen Es funktioniert in einer geschachtelten SELECT-Anweisung, da es Variablen verwendet. Es funktioniert auch nur mit 1 quoteid

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 

Jede Hilfe wäre dankbar, danke!

+0

Ihre Anfrage keine Tabellendefinitionen übereinstimmen. Bitte korrigieren. – Serg

+0

@Serg Ich entschuldige mich, ich habe versucht, lange Tabellennamen auszuziehen, um die Lesbarkeit zu verbessern. Ich glaube, sie passen jetzt alle zusammen. – evade

+1

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

Antwort

3

Verwenden 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' 
Verwandte Themen