Frage So erstellen Sie eine Abfrage mit group_concat in SQL Server [duplizieren]


Diese Frage hat hier bereits eine Antwort:

Ich weiß, dass in SQL-Server können wir nicht verwenden Group_concat Funktion, aber hier ist ein Problem, das ich habe, in dem ich muss Group_Concat meine Abfrage.Ich google es gefunden einige Logik, aber nicht in der Lage, es zu korrigieren.Meine SQL-Abfrage ist

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 gibt mir ein Ergebnis wie

enter image description here

Schauen Sie sich zuerst die 3 Zeilen an. Maskid, Maskenname, Schoolid, Schulname sind gleich, aber maskdetail ist anders, also wollen Sie nur eine Zeile haben, in der die letzte Spalte alle Maskendetails enthalten kann.

Ich möchte meine Ausgabe gerne

enter image description here

Und so weiter. Bitte helfen Sie mir, während Sie eine Anfrage stellen.

Danke im Voraus.


76
2017-07-11 10:54


Ursprung


Antworten:


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 Information:

String-Aggregation in der Welt von SQL Server


105
2017-07-11 10:56



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

20
2017-07-11 11:03



Dies kann auch erreicht werden mit der Scalar-Valued Function im MSSQL 2008
Erklären Sie Ihre Funktion wie folgt,

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 MD.MaskId=@MaskId

    RETURN @SchoolName

END

Und dann wird deine letzte Abfrage wie sein

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: Möglicherweise müssen Sie die Funktion ändern, da ich die vollständige Tabellenstruktur nicht kenne.


6
2017-07-18 09:55



Bitte führen Sie die folgende Abfrage aus, 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

5
2017-07-17 10:53