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

Rah*_*hul 104 sql-server string-aggregation sql-server-group-concat

我知道在sql server中我们不能使用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 ;
Run Code Online (Sandbox Code Playgroud)

它给我的结果如

在此输入图像描述

只看前三行在那个maskid,maskname,schoolid,schoolname是相同的但是maskdetail是不同的,所以想要一行,其中最后一列可以包含所有maskdetails,如maskid等等.

我希望我的输出像

在此输入图像描述

等等.请在查询时帮助我.

提前致谢.

Dev*_*art 139

查询:

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
Run Code Online (Sandbox Code Playgroud)

附加信息:

SQL Server世界中的字符串聚合

  • `tblmask` - `maskdetails` =`1 to many`之间的关系,所以重复的记录不应该在这里. (5认同)
  • 好,我知道了。阿米特·辛格(Amit Singh)的答案将返回经过XML编码的字符串(因为`for xml`的结果是XML文本/对象),因此,例如,<<将变成`>`。而您的答案将返回原样的字符串,因为`value()`处理XML对象并从那里提取文本内容。 (2认同)

Ami*_*ngh 28

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
Run Code Online (Sandbox Code Playgroud)

  • +1.顺便说一下`GROUP BY`这里不需要. (6认同)

Abd*_*ari 7

这也可以使用实现Scalar-Valued FunctionMSSQL 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 MD.MaskId=@MaskId

    RETURN @SchoolName

END
Run Code Online (Sandbox Code Playgroud)

然后你的最终查询就像

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 ;
Run Code Online (Sandbox Code Playgroud)

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


小智 5

请运行以下查询,在您的情况下不需要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
Run Code Online (Sandbox Code Playgroud)

  • 剥离第一个逗号需要STUFF,在你的情况下,maskdetail以逗号结尾 (4认同)