2013-07-11 11 views
69

Ich weiß, dass in SQL-Server können wir nicht verwenden Group_concat Funktion, aber hier ist ein Problem, das ich habe Group_Concat meine Abfrage.Ich google fand es einige Logik, aber nicht in der Lage zu korrekte it.My sQL-Abfrage istWie man eine Abfrage mit group_concat in SQL Server

select m.maskid,m.maskname,m.schoolid,s.schoolname, 
md.maskdetail 
from tblmask m join school s on s.id = m.schoolid 
join maskdetails md on m.maskid = md.maskid 
order by m.maskname ; 

Es hat mich wie

enter image description here

einfach aussehen ersten 3 Reihen In diesem maskid Ergebnis ergibt, maskname, schoolid ist School gleiche, aber maskdetail ist anders, so wollen zu einem Zeile für die, in der letzte Spalte alle Maskendetails wie pro Maske und so weiter enthalten kann.

Ich möchte meine Ausgabe wie

enter image description here

Und so on.So mir bitte helfen, während eine Abfrage für die Herstellung.

Vielen Dank im Voraus.

+1

Dies ist kein * recht * ein Duplikat der Frage zu SQL Server 2005 seit dem Hinzufügen von ['STRING_AGG'] (https://docs.microsoft.com/en-us/sql/t-sql/functions/string-agg-transact-sql) zu SQL Server 2017, also sollten Sie sich das genauer ansehen, wenn Sie mit einem aktuellen SQL Server gesegnet sind. –

Antwort

92

Abfrage:

SELECT 
     m.maskid 
    , m.maskname 
    , m.schoolid 
    , s.schoolname 
    , maskdetail = STUFF((
      SELECT ',' + md.maskdetail 
      FROM dbo.maskdetails md 
      WHERE m.maskid = md.maskid 
      FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') 
FROM dbo.tblmask m 
JOIN dbo.school s ON s.ID = m.schoolid 
ORDER BY m.maskname 

Zusätzliche Informationen:

String Aggregation in the World of SQL Server

+0

hmmm kannst du @Devart erklären ich meine die innere Verbindung geben Ergebnis wie im Bild ... so in allen duplizieren m.maskid , m.maskname , m.schoolid , s.schoolname zu einer Zeile wir brauchen Gruppe von –

+5

Beziehung zwischen 'tblmask' -' maskdetails' = '1 zu viele', so dass Duplikate von Datensätzen nicht hier sein sollten. – Devart

+0

Was ist der Grund für die Verwendung von 'PATH (''), TYPE' und' .value ('.', 'NVARCHAR (MAX)') 'hier, im Gegensatz zu einfachen' PATH ('') 'wie in @ AmitSinghs asnwer ? Ihre Variante ergibt einen viel schwereren Ausführungsplan, hat sie einen versteckten Vorteil, um die Kosten zu rechtfertigen? Wenn nicht, würden Sie Ihre Antwort korrigieren oder ändern, da sie akzeptiert wird und die beste sein soll? – pvgoran

19
Select 
     A.maskid 
    , A.maskname 
    , A.schoolid 
    , B.schoolname 
    , STUFF((
      SELECT ',' + T.maskdetail 
      FROM dbo.maskdetails T 
      WHERE A.maskid = T.maskid 
      FOR XML PATH('')), 1, 1, '') as maskdetail 
FROM dbo.tblmask A 
JOIN dbo.school B ON B.ID = A.schoolid 
Group by A.maskid 
    , A.maskname 
    , A.schoolid 
    , B.schoolname 
+4

+1. Übrigens wird GROUP BY hier nicht benötigt. – Devart

5

bitte die unten stehende Abfrage ausführen, es erfordert nicht STUFF und GROUP BY in Ihrem Fall :

Select 
     A.maskid 
    , A.maskname 
    , A.schoolid 
    , B.schoolname 
    , CAST((
      SELECT T.maskdetail+',' 
      FROM dbo.maskdetails T 
      WHERE A.maskid = T.maskid 
      FOR XML PATH(''))as varchar(max)) as maskdetail 
FROM dbo.tblmask A 
JOIN dbo.school B ON B.ID = A.schoolid 
+3

STUFF ist erforderlich, um das erste Komma zu entfernen, in Ihrem Fall endet maskdetail mit einem Komma –

6

Dies kann auch die, wie folgend, Erklären Sie Ihre Funktion Scalar-Valued Function in MSSQL 2008
mit erreicht werden

CREATE FUNCTION [dbo].[FunctionName] 
(@MaskId INT) 
RETURNS Varchar(500) 
AS 
BEGIN 

    DECLARE @SchoolName varchar(500)       

    SELECT @SchoolName =ISNULL(@SchoolName ,'')+ MD.maskdetail +', ' 
    FROM maskdetails MD WITH (NOLOCK)  
    AND [email protected] 

    RETURN @SchoolName 

END 

Und dann Ihre endgültige Abfrage wie

SELECT m.maskid,m.maskname,m.schoolid,s.schoolname, 
(SELECT [dbo].[FunctionName](m.maskid)) 'maskdetail' 
FROM tblmask m JOIN school s on s.id = m.schoolid 
ORDER BY m.maskname ; 

Hinweis sein: Sie Möglicherweise muss ich die Funktion ändern, da ich die komplette Tabellenstruktur nicht kenne.

+0

Siehe auch: https://gooroo.io/GoorooTHINK/Article/10001/Aggregate-String-Concatenation-in-SQL-Server-2012- like-stringagg-in-PostgreSql/5122 # .Wif5rLaZMWo – Magne