首页 > 解决方案 > 使用 CASE 语句仅在列中显示某些结果(也创建重复项)

问题描述

对不起,如果这没有意义 - 我不知道如何措辞。让我尝试更好地解释。

我目前正在使用一个非常基本的查询来查看属于诊所的患者的人口统计信息。该查询使用CASE语句来创建几个新列,这些列旨在在 Excel 中进行过滤,以便用户稍后查看数据。

其中一项CASE陈述围绕着患者是否在诊所活跃——他们必须在过去 3 年内被视为活跃。该语句仅查看患者的最后一次就诊日期,计算该日期与今天日期之间的差异,然后如果该差异小于 3 年,则显示“是”。

但随后患者有所谓的标志。当医生访问患者的图表时,会弹出不同的标记,指示患者的服务/治疗逾期、未付账单等。可用标记之一是“非活动患者!” 当图表被停用、患者死亡或转移护理等时,由医疗记录部门手动添加。

此查询的目的是显示系统中所有患者的所有人口统计数据,然后有一个字段指示他们是否有“非活动患者!” 标志,然后可以与它们是否按照 3 年标准进行比较。CASE因此,如果患者的图表上附加了该标志,我将第二条语句设置为显示“是”。请注意,我不想看到不活跃的患者,而是所有可用的患者以及这些患者是否有标志。

我的查询有效,尽管一旦我添加了新CASE语句来检查非活动标志,它就变慢了,运行了整整 6 分钟。诚然,系统中有大约 30,000 名患者,其中大多数人的图表上附有许多标志,但这似乎仍然很长。对于确实有该标志的患者,我也得到了重复的结果,因为我选择了不同的记录,但是CASE对于 3 年内活跃患者的第一个语句不会产生重复。

简而言之,我觉得我不会以最有效的方式来解决这个问题。有人对如何清理这个有任何建议吗?请参阅下面的查询。

SELECT DISTINCT
    d.PatientID
    ,d.PatientName
    ,...[other demographic fields like DOB, gender, race]
    ,a.LastVisitDate
    ,a.NextApptDate
    ,(CASE
        WHEN a.LastVisitDate > DATEADD(yy,-3,GETDATE()) THEN 'YES'
        ELSE ''
     END) AS [Active?]
    ,(CASE
        WHEN d.PatientFlag = 'Inactive Patient!' THEN 'YES'
        ELSE ''
     END) AS [Inactive Flag?]

FROM Demographic d FULL OUTER JOIN Appointment a ON d.PatientID = a.PatientID

重复的结果最终看起来像这样。带有非活动标志的患者会重复他们的整行人口统计信息,然后一行显示标志指示器,而另一行不显示。

PatientID    PatientName    ...    LastVisitDate  NextApptDate  Active?    Inactive Flag?
-------------------------------------------------------------------------------------------
1001         John Smith     ...    01/03/2020     NULL          YES
1002         Jane Doe       ...    07/23/2020     12/29/2020    YES        
1002         Jane Doe       ...    07/23/2020     12/29/2020    YES        YES
1003         Bob Brown      ...    NULL           12/21/2020    YES

更新:这是我得到的实际重复结果之一的示例。正如我们所看到的,该患者的行之一具有由 创建的非活动指示符CASE,而另一行没有(因此使它们成为两个唯一行)。该患者最后一次见到是今年,因此按照 3 年的标准,他们仍然活跃,但他们的图表上无疑有非活跃标志,因为他们现在已经去世。该患者在系统中还总共有 35 次过去就诊,显然我的结果中没有得到所有 35 次就诊。这是因为LastVisitDateNextApptDate是唯一的并且与 具有 1:1 的关系PatientID

在此处输入图像描述

标签: sqlsql-servercase

解决方案


也许你需要这样的东西......

您实际上并不想要所有约会,您只想要最近的约会。正确的?

SELECT d.PatientID, d.PatientName
    -- ...[other demographic fields like DOB, gender, race]
    , a.LastVisitDate
    , a.NextApptDate
    , IsActive     = CASE WHEN a.LastVisitDate > DATEADD(YEAR, -3, GETDATE()) THEN 'YES' ELSE '' END
    , InactiveFlag = CASE WHEN d.PatientFlag = 'Inactive Patient!' THEN 'YES' ELSE '' END
FROM Demographic d
    OUTER APPLY (
        SELECT TOP(1) a.LastVisitDate, a.NextApptDate
        FROM Appointment a
        WHERE d.PatientID = a.PatientID
        ORDER BY a.LastVisitDate DESC
    ) a

推荐阅读