T-SQL CONCATE ROW-Werte aus #Temporary Table

Ich arbeite derzeit an einer SQL-Abfrage in T-SQL auf SQL server 2012 mit dem Ziel, mehrere Tabellen in 1 Tabelle zu konkurrieren oder zusammenzuführen und mehrere Zeilen zu kompilieren. So weit geht es gut Ich benutze STUFF und FOR XML PATH, um mehrere Zeilen in 1 zu verwandeln.

Leider, wenn ich meine 2 temporären Tabellen in 1 Endergebnis Tabelle merge möchte, verschwinden die zusammengeschlossenen (verschmolzenen) Zeilen wieder.

Meine Tische sehen folgendermaßen aus:

table #BasicAngebote

OfferId | Tile | Manager | DeliveryVersionId | ----------+--------+----------+-------------------| 4 | Offer1 | John Doe | 1 | 5 | Offer2 | Jane Doe | 2 | 

Tabelle #TmpLabels

 DeliveryVersionId | Label | ------------------+-------------------------+ 1 | Service, Time, Material | 2 | Consulting, Time | 

endgültiges Ergebnis, leider nicht die gewünschte Ausgabe. Die temporären Tische scheinen wieder split zu werden:

 OfferId | Title | Manager | Delivery ----------+--------+----------+------------------------ 4 | Offer1 | John Doe | Service 4 | Offer1 | John Doe | Time 4 | Offer1 | John Doe | Material 5 | Offer2 | Jane Doe | Consulting 5 | Offer2 | Jane Doe | Time 

Gewünschter Ausgang:

 OfferId | Title | Manager | Delivery ----------+--------+----------+------------------------ 4 | Offer1 | John Doe | Service, Time, Material 5 | Offer2 | Jane Doe | Consulting, Time 

Meine Abfrage, um die Tabellen zusammenzuführen, sieht so aus:

 -- Delivery Methods SELECT [D].DeliveryVersionId, [DM].Label INTO #TmpLabels FROM [MySchema].[Delivery] [D] INNER JOIN dbo.DeliveryMethods [DM] ON [DM].DeliveryMethodId = [D].DeliveryMethodId SELECT DeliveryVersionId, Label = STUFF( (SELECT ',' + Label FROM #TmpLabels FOR XML PATH('')), 1, 1, '' ) FROM #TmpLabels GROUP BY DeliveryVersionId -- FinalResults SELECT [O].OfferId, [O].Title, [O].OfferManager, [DL].Label AS Delivery FROM #BasicOffers [O] INNER JOIN #TmpLabels [DL] ON [DL].DeliveryVersionId = [O].DeliveryVersionId 

Ich weiß nicht wirklich, ob es die beste Lösung ist, alles in einen temporären Tisch zu speichern und dann zu merge oder alles auf einmal auszuwählen.

Auf jeden Fall scheint meine Abfrage leider nicht richtig zu funktionieren.

Haben Sie eine Idee, wie Sie dieses Problem lösen können?

Danke vielmals!

 ;WITH BasicOffers(OfferId,Tile,Manager,DeliveryVersionId ) AS ( SELECT 4 , 'Offer1' , 'John Doe' , 1 Union all SELECT 5 , 'Offer2' , 'Jane Doe' , 2 ) ,TmpLabels(DeliveryVersionId,Label) AS ( SELECT 1 , 'Service, Time, Material ' Union all SELECT 2 , 'Consulting, Time' ) Select B.OfferId,B.Tile,B.Manager, T.Label AS Delivery From BasicOffers B INNER JOIN TmpLabels T ON T.DeliveryVersionId=B.DeliveryVersionId --To COnvert into Comma separated ;WITH Cte_Convert(OfferId,Title,Manager,Delivery ) AS ( SELECT 4 , 'Offer1' , 'John Doe' , 'Service' Union All SELECT 4 , 'Offer1' , 'John Doe' , 'Time' Union All SELECT 4 , 'Offer1' , 'John Doe' , 'Material' Union All SELECT 5 , 'Offer2' , 'Jane Doe' , 'Consulting' Union All SELECT 5 , 'Offer2' , 'Jane Doe' , 'Time' ) Select DISTINCT OfferId,Title,Manager,STUFF((SELECT DISTINCT ',' + CAST(i.Delivery AS VARCHAR(20)) FROM Cte_Convert i WHERE i.OfferId=o.OfferId FOR XML PATH ('')),1,1,'')AS Delivery FROM Cte_Convert o 

  I Assume either above or below code might be useful 

  --Split Delivery column as comma separted in below Cte ;WITH Cte_Convert(OfferId,Title,Manager,Delivery ) AS ( SELECT 4 , 'Offer1' , 'John Doe' , 'Service' Union All SELECT 4 , 'Offer1' , 'John Doe' , 'Time' Union All SELECT 4 , 'Offer1' , 'John Doe' , 'Material' Union All SELECT 5 , 'Offer2' , 'Jane Doe' , 'Consulting' Union All SELECT 5 , 'Offer2' , 'Jane Doe' , 'Time' ) ,Final AS ( SELECT ROW_NUMBER()OVER(Order by (SELECT ''))AS DeliveryVersionId ,* FROM ( SELECT DISTINCT OfferId,Title,Manager,STUFF((SELECT DISTINCT ',' + CAST(i.Delivery AS VARCHAR(20)) FROM Cte_Convert i WHERE i.OfferId=o.OfferId FOR XML PATH ('')),1,1,'')AS Label FROM Cte_Convert o )dt ) ,BasicOffers(OfferId,Tile,Manager,DeliveryVersionId ) AS ( SELECT 4 , 'Offer1' , 'John Doe' , 1 Union all SELECT 5 , 'Offer2' , 'Jane Doe' , 2 ) ,TmpLabels(DeliveryVersionId,Label) AS ( SELECT 1 , 'Service, Time, Material ' Union all SELECT 2 , 'Consulting, Time' ) Select B.OfferId,B.Tile,B.Manager, T.Label AS Delivery From BasicOffers B INNER JOIN Final T ON T.DeliveryVersionId=B.DeliveryVersionId 

Ich benutzte temporäre Tische und linke äußere Verknüpfung zwischen ihnen, um es zu lösen. Bitte beachten Sie, dass ich vermutete, dass DeliveryVersionId ein primärer Schlüssel in den #TmpLabels ist.

Bitte lassen Sie mich wissen, ob es Ihnen hilft.

 DECLARE @BasicOffers Table ( OfferId int, Tile varchar(100), Manager varchar(100), DeliveryVersionId int) insert into @BasicOffers values (4,'Offer1','John Doe',1) insert into @BasicOffers values (5,'Offer2','Jane Doe',2) DECLARE @TmpLabels Table ( DeliveryVersionId int, Label varchar(100) ) insert into @TmpLabels values (1,'Service, Time, Material') insert into @TmpLabels values (2,'Consulting, Time') Select OfferId, Tile, Manager, Label as Delivery From @BasicOffers A Left Outer join @TmpLabels B on A.DeliveryVersionId=B.DeliveryVersionId