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