2016-05-05 5 views
2

Ich brauche eine Liste aller Aktivitäten in unserem System. Eine Aktivität kann 1: viele Dienstanbieter haben, die die Aktivität verwalten - also habe ich eine Tabelle "Attraktivität" mit einer Verknüpfungstabelle für viele bis viele (ActivityServiceProvider) und eine Liste von Dienstanbietern.Mehrere Zeilen in eine Zeile, wenn es eine Gruppe gibt

Eine Abfrage zum Abrufen der Daten sieht so aus.

SELECT a.id, sp.Description 
FROM Activity a 
INNER JOIN dbo.ActivityServiceProvider asp 
    ON asp.ActivityID = a.ID 
INNER JOIN dbo.ServiceProvider sp 
    ON sp.ID = asp.ServiceProviderID 

Aber wie könnte es pro Aktivität mehr als ein Service-Provider sein, muss ich irgendwie STUFF verwenden, um die Liste der Service-Provider in einer einzigen Zeile Spalte zu erhalten.

Ich versuchte dies, aber es ist mit jsut eine einzelne Zeile andernfalls zurückgegeben wird:

SELECT 
    STUFF((
     SELECT a.ID, ', ' + MAX(sp.Description) 
     FROM Activity a 
     INNER JOIN dbo.ActivityServiceProvider asp 
      ON asp.ActivityID = a.ID 
     INNER JOIN dbo.ServiceProvider sp 
      ON sp.ID = asp.ServiceProviderID 
     GROUP BY a.ID 
     FOR XML PATH(''),TYPE).value('(./text())[1]','VARCHAR(MAX)') 
    ,1,2,'') AS NameValues 

Kann jemand das Problem vor Ort? Das Schlüsselwort "STUFF" und das Schlüsselwort "FOR XML" verwirren mich, sodass ich möglicherweise einen Basisfehler erstelle, aber ich versuche, eine ActivityID und eine ServiceProviders-Spalte mit einer kommagetrennten Liste von Dienstanbietern zurückzugeben.

Antwort

2

Sie benötigen eine äußere Abfrage, um jede Aktivität abzurufen. Dann kombiniert die Unterabfrage die Ergebnisse für jede Beschreibung. Es gibt keine Notwendigkeit für Aggregation in der Unterabfrage - die FOR XML PATH() kümmert sich darum:

SELECT a.*, 
     STUFF((SELECT ', ' + sp.Description 
       FROM dbo.ActivityServiceProvider asp INNER JOIN 
        dbo.ServiceProvider sp 
        ON sp.ID = asp.ServiceProviderID 
       WHERE asp.ActivityID = a.ID 
       FOR XML PATH(''), TYPE 
      ).value('.', 'VARCHAR(MAX)' 
        ), 1, 2, '' 
      ) AS NameValues 
FROM activity a; 
+1

Danke - das hat funktioniert. Ich muss herausfinden, warum, aber - wow. Vielen Dank. – Craig