在连接表上使用STUFF并用常量字符串替换NULL值

问题描述 投票:0回答:2

尝试使用下面的代码获取联接表的结果。是否可以将查询结果与连接结合在一起,同时替换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

sql sql-server
2个回答
1
投票

您可以将主查询包装在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

1
投票

只需使用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()只删除了第一个逗号 - 这是一个非常不重​​要的操作部分。

© www.soinside.com 2019 - 2024. All rights reserved.