Sql server 将逗号分隔的数据聚合到适当的行中

Sql server 将逗号分隔的数据聚合到适当的行中,sql-server,tsql,Sql Server,Tsql,我正在SQL Server 2014中编写一个SQL查询,我需要创建一个查询,返回一个结果集,该结果集的每一行都包含一个逗号分隔的列表,其中包含分配给该行学校的每个地区经理。我无法使用SQL Server 2017的String\u agg功能。我正在使用FOR XML PATH和STUFF的方法,就像这个线程中使用的方法一样: 我的脚本正在生成一个逗号分隔的列表,但它正在生成一个包含每个管理者的列表,无论该管理者是否分配给该学校,并且它正在为查询结果中的每一行返回相同的列表,而不是只显示分配给

我正在SQL Server 2014中编写一个SQL查询,我需要创建一个查询,返回一个结果集,该结果集的每一行都包含一个逗号分隔的列表,其中包含分配给该行学校的每个地区经理。我无法使用SQL Server 2017的
String\u agg
功能。我正在使用
FOR XML PATH
STUFF
的方法,就像这个线程中使用的方法一样:

我的脚本正在生成一个逗号分隔的列表,但它正在生成一个包含每个管理者的列表,无论该管理者是否分配给该学校,并且它正在为查询结果中的每一行返回相同的列表,而不是只显示分配给该学区的管理者列表

with district_Managers as 
(
    select
        rtrim(ltrim(CONCAT(p.person_first_name, ' ' , p.person_last_name))) as name,
        m.District_GUID as Manager_district_guid,
        s.District_GUID as School_district_guid,
        d.District_Name,
        s.School_Name, 
        s.school_guid
    from 
        Manager m
    inner join 
        district d on d.District_GUID = m.District_GUID
    inner join 
        person p on m.person_guid = p.person_guid
    inner join 
        school s on s.district_Guid = m.District_GUID
    where 
        m.Manager_position_text = 'DAI' and m.Manager_hire_flag = 'W'
)
select
    (stuff((select ','+ [name] 
            from district_Managers 
            group by Manager_district_Guid 
            for xml path('')), 1, 1, '')) as [Name], 
    School_Name AS [School Name], District_Name AS [District Name],
    (select count(*) 
     from dbo.Manager m 
     where m.district_guid = School_district_guid 
       and m.Manager_position_text = 'DAI' 
       and m.Manager_hire_flag = 'W') AS [Count]
from
    district_Managers
order by 
    [Count] desc, District_Name  
如何将字段中列出的经理限制为分配给学校的经理


编辑:放置for xml语句

您需要将行与外部查询匹配。注意行-
,其中csl.School\u district\u guid=dm.School\u district\u guid
。。。我在做一些假设

with district_Managers as 
    (
        select
        rtrim(ltrim(CONCAT(p.person_first_name, ' ' , p.person_last_name))) as name,
        m.District_GUID as Manager_district_guid,
        s.District_GUID as School_district_guid,
        d.District_Name,
        s.School_Name, 
        s.school_guid
        from Manager m
        inner join district d on d.District_GUID = m.District_GUID
        inner join person p on m.person_guid = p.person_guid
        inner join school s on s.district_Guid = m.District_GUID
        where m.Manager_position_text = 'DAI' and m.Manager_hire_flag = 'W'
    )
    select
    (
        stuff(
        (
            select ','+ [name] 
            from district_Managers csl
            where csl.School_district_guid = dm.School_district_guid
            group by Manager_district_Guid for XML path('')
        ),1,1,'') 

    ) as [Name], School_Name AS [School Name], District_Name AS [District Name],
    (select count(*) from dbo.Manager m where m.district_guid = School_district_guid and m.Manager_position_text = 'DAI' and m.Manager_hire_flag = 'W'
        ) AS [Count]
    FROM district_Managers dm
    Order By [Count] Desc, District_Name 

如果您只想获得不同的行,那么您可以使用
SELECT distinct…
,也可以在其他列周围使用
MAX()
,并使用
GROUP BY
逗号分隔列表。

您需要将行与外部查询相匹配。注意行-
,其中csl.School\u district\u guid=dm.School\u district\u guid
。。。我在做一些假设

with district_Managers as 
    (
        select
        rtrim(ltrim(CONCAT(p.person_first_name, ' ' , p.person_last_name))) as name,
        m.District_GUID as Manager_district_guid,
        s.District_GUID as School_district_guid,
        d.District_Name,
        s.School_Name, 
        s.school_guid
        from Manager m
        inner join district d on d.District_GUID = m.District_GUID
        inner join person p on m.person_guid = p.person_guid
        inner join school s on s.district_Guid = m.District_GUID
        where m.Manager_position_text = 'DAI' and m.Manager_hire_flag = 'W'
    )
    select
    (
        stuff(
        (
            select ','+ [name] 
            from district_Managers csl
            where csl.School_district_guid = dm.School_district_guid
            group by Manager_district_Guid for XML path('')
        ),1,1,'') 

    ) as [Name], School_Name AS [School Name], District_Name AS [District Name],
    (select count(*) from dbo.Manager m where m.district_guid = School_district_guid and m.Manager_position_text = 'DAI' and m.Manager_hire_flag = 'W'
        ) AS [Count]
    FROM district_Managers dm
    Order By [Count] Desc, District_Name 

如果您只想获得不同的行,那么您可以使用
SELECT distinct…
,或者在其他列周围使用
MAX()
,并使用
GROUP BY
逗号分隔列表。

查询的
FOR XML
部分在哪里?@Bjones上传了错误的sql。修复了post,查询中XML的
部分在哪里?@Bjones上传了错误的sql。修好了柱子