如何解决SQL Server 2016:将 FOR XML 和 STUFF 与多连接查询结合使用
我有一个出于报告目的的查询,以列出未提交季度报告的雇主和未提交季度报告的雇主。这是我的查询:
with employerIds as (select distinct Employerid
from employerTransaction),quarters as (select distinct QId
from employerTransaction)
select ei.EmployerId,e.EmployerName,q.QId
from employerIds as ei
cross join quarters as q
left join employerTransaction as et
on et.EmployerId = ei.EmployerId
and et.QId = q.QId
join employer as e
on e.EmployerId = ei.EmployerId
where et.employerid is null
group by ei.employerid,q.QId
order by ei.EmployerId,q.QId
查询结果如下:
EmployerId EmployerName QId
1 Potato Inc 20193
1 Potato Inc 20202
1 Potato Inc 20203
2 Donuts LLC 20202
2 Donuts LLC 20203
3 Pineapple Logistics 20191
3 Pineapple Logistics 20192
3 Pineapple Logistics 20193
3 Pineapple Logistics 20194
我想要的是将 QId 列合并为每个 EmployerId 的一行,如下所示:
EmployerId EmployerName QId
1 Potato Inc 20193,20202,20203
2 Donuts LLC 20202,20203
3 Pineapple Logistics 20191,20192,20193,20194
我使用的是 sql Server 2016,所以很遗憾我无法利用 string_agg()
,必须使用 FOR XML
和 stuff()
。我不确定如何在具有多个连接的查询上使用 stuff()
。任何帮助表示赞赏。
解决方法
这是for xml path
子句在起作用。 stuff
只是去掉开头的 ','
with sampledata as (
-- your original query here
)
select EmployerId,EmployerName,stuff( (select ','+ cast(t2.Qid as varchar(5))
from sampledata t2
where t2.EmployerId = t1.EmployerId and t2.EmployerName = t1.EmployerName
for xml path ('')),1,'') qids
from sampledata t1
group by EmployerId,EmployerName
退货
EmployerId EmployerName qids
1 Potato Inc 20193,20202,20203
2 Donuts LLC 20202,20203
3 Pineapple Logistics 20191,20192,20193,20194
,
试试这个解决方案
Select ei.EmployerId,e.EmployerName,ISNULL(STUFF((Select Distinct ',' + Cast(QId As Varchar(500))
From employerTransaction As Q
Where et.QId = q.QId
FOR XML PATH('')),''),'-') As [NewQID]
From employerIds As ei
Left Join employerTransaction as et on et.EmployerId = ei.EmployerId and et.QId = q.QId
Join employer as e on e.EmployerId = ei.EmployerId
Where et.employerid is null
Group By ei.employerid,e.EmployerName
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。