如何在sql server中使用group_concat进行查询

我知道,在SQL Server中,我们不能使用Group_concat函数,但这里有一个问题,我有我需要Group_Concat我的query.I谷歌它发现了一些逻辑,但无法纠正它。我的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 ; 

它给了我像结果一样

在这里输入图像描述

只看前面3行在这个maskid中,maskname,schoolid,schoolname是一样的,但是maskdetail是不同的,所以想要一行的最后一列可以包含所有的maskdetails作为每个maskid等等。

我想要我的输出

在这里输入图像描述

等等。所以请在帮助我的同时查询。

提前致谢。

    4 Solutions collect form web for “如何在sql server中使用group_concat进行查询”

    查询:

     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世界中的string聚合

     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 

    请运行下面的查询,它不需要你的情况下的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 

    这也可以使用MSSQL 2008Scalar-Valued Function来实现
    声明你的function如下,

     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 

    然后你的最终查询将是

     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 ; 

    注意:您可能必须更改该函数,因为我不知道完整的表结构。