如何在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等等。
我想要我的输出
等等。所以请在帮助我的同时查询。
提前致谢。
查询:
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 2008
的Scalar-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 ;
注意:您可能必须更改该函数,因为我不知道完整的表结构。