Как сделать запрос с помощью group_concat в sql-сервере

Я знаю, что в sql-сервере мы не можем использовать функцию Group_concat, но здесь есть одна проблема, в которой мне нужно Group_concat мой запрос .I google нашел логику, но не смог ее исправить. Мой SQL-запрос это

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 ;

Это дает мне результат, как

enter image description here

Просто посмотрите первые 3 строки. В этом масках, maskname, schoolid, schoolname это же, но maskdetail отличается, поэтому хотите одну строку для той, в которой последний столбец может содержать все maskdetails в соответствии с маскирой и т.д.

Я хочу, чтобы мой вывод выглядел как

enter image description here

И так далее. Поэтому, пожалуйста, помогите мне, делая запрос для этого.

Спасибо заранее.

Ответ 1

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

Дополнительная информация:

Агрегация строк в мире SQL Server

Ответ 2

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

Ответ 3

Это также может быть достигнуто с помощью Scalar-Valued Function in MSSQL 2008
Объявите свою функцию следующим образом:

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

И тогда ваш окончательный запрос будет похож на

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 ;

Примечание. Возможно, вам придется изменить функцию, так как я не знаю полной структуры таблицы.

Ответ 4

Пожалуйста, запустите указанный ниже запрос, это не требует STUFF и GROUP BY в вашем случае:

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