2017-05-09 4 views
1

Ich habe eine Abfrage, die eine Liste der Dienste und ContractorIDs zurückgibt. Ich muss diese Dienste in ein Feld stopfen, um sie mit einer anderen Select-Anweisung von ContractorID zu verbinden, aber ich kann nicht herausfinden, wie es geht.SQL Stuff von Unterabfrage

Die Select, die die Dienste aufgeführt ist "

SELECT DISTINCT SM.ContractorID, 

CASE WHEN S.bitRestrictedSelection = 1 
     THEN S.vchDescription + '*' 
     ELSE S.vchDescription 
    END AS vchDescription 
FROM tblAscServiceRegionToOperator SRTO 
INNER JOIN tblServiceMatrix SM 
    ON SRTO.OperatorID = 12624 
    AND SM.ServiceRegionID = SRTO.ServiceRegionID 
    AND SM.bitPrimaryService = 1 
INNER JOIN tblServices S 
    ON S.ServiceID = SM.ServiceID 

Dies ergibt folgendes:

enter image description here

Im Beispiel für Auftragnehmer # 16 Er hat vier Dienste, die ich brauche sie zu setzen in einem Feld namens Dienste durch den Beitritt mit einer anderen Select-Anweisung Ich habe Folgendes versucht, aber ich bekomme Fehler:

Select DISTINCT CompanyID, vchCompanyName as CompanyName,vchFIDNumber,vchPrimContactName, vchPrimContactEmail 
,stuff((',' 
    SELECT DISTINCT 
    SM.ContractorID, 

     CASE WHEN S.bitRestrictedSelection = 1 
      THEN S.vchDescription + '*' 
      ELSE S.vchDescription 
     END AS vchDescription 
    FROM tblAscServiceRegionToOperator SRTO 
    INNER JOIN tblServiceMatrix SM 
     ON SRTO.OperatorID = 12624 
     AND SM.ServiceRegionID = SRTO.ServiceRegionID 
     AND SM.bitPrimaryService = 1 
    INNER JOIN tblServices S 
     ON S.ServiceID = SM.ServiceID 
     FOR XML PATH('') 
       ), 1, 1, '') as Services from tblCompany 

Jede Hilfe wird sehr geschätzt !!!

+2

Suchen Sie nach "Common Table Expressions" (CTEs), da Sie eine Unterabfrage so kapseln können, dass sie nur wie eine Tabelle aussieht und wirklich helfen kann, Ihren SQL-Code zu vereinfachen. Es erleichtert das Zusammenfügen. Ein Problem in einzelne CTEs zu zerlegen und sie dann wieder zusammenzufügen, um die gewünschte Abfrage aufzubauen, kann ein sehr nützlicher Ansatz sein. – pmbAustin

+0

Welche Fehler haben Sie? –

Antwort

1

Die folgende Abfrage funktionieren würde:

SELECT SS.contractor Contractor, 
     STUFF((SELECT '; ' + US.vchdescription 
       FROM ServicesList US 
       WHERE US.contractor = SS.contractor 
       FOR XML PATH('')), 1, 1, '') [Services] 
FROM ServicesList SS 
GROUP BY SS.contractor 
ORDER BY 1 

Ich habe eine Tabelle erstellt und dort zwei Reihen für Auftragnehmer eingefügt = 16, für Sie auf die Idee zu bekommen. Sie können den in den Kommentaren angegebenen Vorschlag verwenden, um die erste Auswahl in eine CTE zu verpacken und dann die STUFF-Funktion auf dieser CTE auszuführen.

Sie können eine Demo dieser Abfrage here überprüfen.