Sql server 如何在sql server中使用组_concat进行查询

Sql server 如何在sql server中使用组_concat进行查询,sql-server,string-aggregation,sql-server-group-concat,Sql Server,String Aggregation,Sql Server Group Concat,我知道在sql server中,我们不能使用Group\u concat函数,但我有一个问题,我需要Group\u 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 = m

我知道在sql server中,我们不能使用
Group\u concat
函数,但我有一个问题,我需要
Group\u 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 ;
它给了我这样的结果

只需查看该maskid、maskname、schoolid、schoolname中的前3行,它们是相同的,但maskdetail是不同的,所以希望最后一列中的一行可以包含每个maskid的所有maskdetail,依此类推

我希望我的输出像

等等。请帮我查询一下


提前感谢。

查询:

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
其他信息:

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

请运行以下查询,在您的情况下,它不需要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中的标量值函数来实现 声明您的函数如下:

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 ;

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

+1。顺便说一句,
groupby
这里不需要。hmmm你能解释一下@Devart吗?我的意思是内部连接会产生像图像中那样的结果…所以要将所有重复的m.maskid、m.maskname、m.schoolid、s.schoolname组合到一行,我们需要通过
tblmask
-
maskdetails
=
1到多个
,,所以记录的副本不应该出现在这里。与@amitsigh的asnwer中简单的
路径(“”)、键入
.value(“”、'NVARCHAR(MAX)
相比,这里使用
路径(“”)
的原因是什么?您的变体产生了一种方式,一种更重的执行计划,它是否有一些隐藏的优势来证明成本的合理性?如果没有,你会纠正或修改你的答案,因为它被接受,并且应该是最好的一个?好的,我知道了。Amit Singh的答案将返回XML编码的字符串(因为
for XML
select的结果是一个XML文本/对象),因此,例如,
奇妙的工作方式就像一个满足我需要的符咒+1STUFF需要去掉第一个逗号,在您的案例中,maskdetail以逗号结尾。自从SQL Server 2017中添加了以来,它与关于SQL Server 2005的问题并不完全相同,因此,如果您有幸拥有最新的SQL Server,您可能希望了解这一点。另请参阅: