我正在尝试制作一个表格,显示所有入住医院的患者。我可以很好地连接客户、患者、入住、预约数据,但警报表有多行,我尝试聚合/连接/汇总。我尝试创建XML语句,但似乎不起作用。我希望患者的所有警报都是一行中的单个逗号分隔字符串。以下是我所拥有:
select DISTINCT
a.ResourceAbbreviation1, a.AppointmentType, a.StatusNum, c.sLastName,
pt.Name, pt.WeightString, pt.AgeShort, pt.Breed, pt.Species, pt.Gender, pt.NewPatient,
(select SUBSTRING((
select ',' + al.stext AS 'data()'
FOR XML PATH('')
), 2, 9999) as cautions),
pt.Classification, p.kPatientId
from dbo.entpatients pt
join alerts al
on al.kpatientid = pt.IDPatient
join dbo.PatientCheckIns P
on pt.IDPatient=p.kPatientId
join dbo.EntAppointments a
on a.IDPatient = p.kPatientId
join dbo.clients c
on c.kID=a.IDClient
where cast (a.StartTime as date) = cast(getdate() as date)
and a.StatusNum=4;
1条答案
按热度按时间eyh26e7m1#
您需要将alerts表引用作为
FROM
移动到subselect中。我还建议使用
AS text()
而不是AS data()
(或者完全省略)来避免不需要的空格,使用STUFF()
而不是SUBSTRING()
来去掉前导逗号,额外的嵌套SELECT
也是不需要的。如果您的警报文本可能包含特殊的XML字符(如〈、〉或&),而这些字符可能会被编码,那么我建议您使用一个稍微修改过的表单,使用
.value()
函数来提取连接的文本。这样可以避免在结果中看到
<
、>
和&
之类的编码。如果您使用的是SQL Server 2017或更高版本,您还可以切换到相对较新的
STRING_AGG()
函数。我还要回顾一下您对
DISTINCT
的需求。在某些情况下,当您有意希望查询返回希望消除的重复行时,使用DISTICT是合适的。例如,如果您知道同一个患者可能多次访问相同的选定数据,则DISTICT可能是合适的。但是,如果您不知道原因而将其放入以消除重复,这可能是欠约束连接或其他逻辑问题的迹象,需要进一步检查。