如何在 sql 服务器中使用 group_concat 进行查询

我知道在 sql 服务器中我们不能使用 Group_concat函数,但这里有一个问题,我需要 Group_Concat我的查询。我谷歌它发现了一些逻辑,但不能纠正它。我的 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

只要看前三行,在那个孩子,面具名称,学校名称,学校名称是相同的,但面具细节是不同的,所以想要一行,其中最后一列可以包含所有的面具细节,每个面具,等等。

我希望我的输出像

enter image description here

等等,所以请帮助我,同时提出一个问题。

先谢谢你。

266490 次浏览

质疑:

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

附加信息:

SQLServer 世界中的字符串聚合

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 和 GROUPBY 在您的情况:

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来实现
按如下方式声明函数,

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 ;

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