尝试使用下面的代码获取联接表的结果。是否可以将查询结果与连接结合在一起,同时替换NULL值?我尝试了下面的代码,但我不能让他们使用GROUP BY。
SELECT
tblAdmission.AdmissionID
, CONCAT(LastName, ', ', FirstName) [Name]
, Birthdate
, AdmissionDate
, Ward
, Service
, Outcome
, ISNULL(
STUFF((SELECT ',' + OrganismName
FROM tblOrganism
WHERE tblOrganism.OrganismID = tblHAIFile.OrganismID
FOR XML PATH('')), 1, 1, '')
, 'No Isolate Found') [Isolated Organisms]
FROM
tblAdmission
INNER JOIN tblPatient ON tblAdmission.PatientID = tblPatient.PatientID
INNER JOIN tblHAIFile ON tblAdmission.AdmissionID = tblHAIFile.AdmissionID
LEFT JOIN tblOrganism ON tblHAIFile.OrganismID = tblOrganism.OrganismID
GROUP BY
tblAdmission.AdmissionID, CONCAT(LastName, ', ', FirstName),
Birthdate, AdmissionDate, Ward, Service, Outcome, tblHAIFile.OrganismID
这是上面查询的当前输出,以及我正在尝试创建的那个:https://imgur.com/yXCmtsZ
您可以将主查询包装在CTE中,但排除FOR XML PATH
部分,然后使用第二个CTE来拆分/保存您的列IsolatesFound
。最终查询将通过ID将它们连接在一起并使用distinct
我用过这个数据样本:
;WITH Tmp (ID, Name , BirthDate , AdmissionDate, Ward, Service, OutCome , IsolatesFound) as
(
SELECT 4 , 'Hammer, Oliver' , CAST('1/21/1993' AS DATE) , CAST('5/1/1993' AS DATE) , 'Ward 9' , 'Gen Ped 1' , 'No Specified' , 'No Isolate Found'
UNION ALL
SELECT 10 , 'Hammer, Oliver' , CAST('1/22/2000' AS DATE) , CAST('2/28/2018' AS DATE) , 'NICU' , NULL , 'No Specified' , 'No Isolate Found'
UNION ALL
SELECT 10 , 'Hammer, Oliver' , CAST('1/22/2000' AS DATE) , CAST('2/28/2018' AS DATE) , 'NICU' , NULL , 'No Specified' , 'Something'
)
, Main (Id , [Isolated Organisms] ) as
(
SELECT Id ,
STUFF(CAST((SELECT ','+ IsolatesFound
FROM Tmp a
WHERE a.ID = t.ID
FOR XML PATH (''),TYPE ) AS NVARCHAR(2000)),1,1,'')
FROM tmp t
GROUP BY t.ID
)
SELECT DISTINCT m.Id , t.BirthDate , t.AdmissionDate , t.Ward , t.Service , t.OutCome ,m.[Isolated Organisms]
FROM Main m
JOIN Tmp t
ON m.Id = t.ID
查看可以在现有表上应用的代码:
;WITH MainQuery as
(
SELECT
tblAdmission.AdmissionID
, CONCAT(LastName, ', ', FirstName) [Name]
, Birthdate
, AdmissionDate
, Ward
, Service
, Outcome
, ISNULL(IsolatesFound, 'No Isolate Found') IsolatesFound
FROM
tblAdmission
INNER JOIN tblPatient ON tblAdmission.PatientID = tblPatient.PatientID
INNER JOIN tblHAIFile ON tblAdmission.AdmissionID = tblHAIFile.AdmissionID
LEFT JOIN tblOrganism ON tblHAIFile.OrganismID = tblOrganism.OrganismID
)
, Split (AdmissionID , [Isolated Organisms] ) as
(
SELECT t.AdmissionID ,
STUFF(CAST((SELECT ','+ IsolatesFound
FROM MainQuery a
WHERE a.AdmissionID= t.AdmissionID
FOR XML PATH (''),TYPE ) AS NVARCHAR(2000)),1,1,'')
FROM MainQuery t
GROUP BY t.AdmissionID
)
SELECT DISTINCT m.AdmissionID, t.BirthDate , t.AdmissionDate , t.Ward , t.Service , t.OutCome ,m.[Isolated Organisms]
FROM Split m
JOIN MainQuery t
ON m.AdmissionID= t.AdmissionID
只需使用COALESCE()
:
SELECT . . .
STUFF((SELECT ',' + COALESCE(o.OrganismName, 'No Isolate Found')
FROM tblOrganism o
WHERE o.OrganismID = tblHAIFile.OrganismID
FOR XML PATH('')
), 1, 1, ''
) as [Isolated Organisms]
另外,我怀疑你在外部查询中需要tblOrganism
。 。 。你可能也不需要GROUP BY
:
SELECT . . .,
STUFF((SELECT ',' + COALESCE(o.OrganismName, 'No Isolate Found')
FROM tblOrganism o
WHERE o.OrganismID = tblHAIFile.OrganismID
FOR XML PATH('')
), 1, 1, ''
) as [Isolated Organisms]
FROM tblAdmission a INNER JOIN
tblPatient p
ON a.PatientID = p.PatientID;
通常,您不希望表格收集外部FROM
中字符串中的项目。
此外,此方法基于XML。 STUFF()
根本不需要它。 STUFF()
只删除了第一个逗号 - 这是一个非常不重要的操作部分。