Jak zrobić zapytanie z grupy concat w SQL server [duplikat]

To pytanie ma już odpowiedź tutaj:

Wiem, że w sql serverze nie możemy używać funkcji Group_concat, ale tutaj mam jeden problem, w którym muszę Group_Concat moje zapytanie.Znalazłem w google jakąś logikę, ale nie jestem w stanie poprawić it.My zapytanie sql to

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 ;

It daje mi wynik jak

Tutaj wpisz opis obrazka

Wystarczy spojrzeć pierwsze 3 wiersze w tym maskid, maskname, schoolid, schoolname jest taki sam, ale maskdetail jest inny, więc chcesz jeden wiersz dla tego, w którym ostatnia kolumna może zawierać wszystkie maskdetails jak na maskid i tak dalej.

I want my output like

Tutaj wpisz opis obrazka

I tak on.So proszę o pomoc przy tworzeniu zapytania.

Z góry dzięki.
Author: Adrian Carneiro, 2013-07-11

4 answers

Query:

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

Dodatkowe informacje:

Agregacja łańcuchów w świecie SQL Server

 112
Author: Devart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-31 09:49: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
 23
Author: Amit Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-11 11:03:49

Można to również osiągnąć za pomocą Scalar-Valued Function w MSSQL 2008
Declare your function as following,

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

I wtedy twoje ostateczne zapytanie będzie takie jak

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 ;

Uwaga: być może będziesz musiał zmienić funkcję, ponieważ nie znam pełnej struktury tabeli.

 6
Author: AbdulRahman Ansari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-18 09:55:29

Proszę uruchomić poniższe zapytanie, to nie wymaga rzeczy i grupy przez w Twoim przypadku:

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
Author: roopaliv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-17 10:53:20