You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQLServer查询:首次就诊前两个诊断同列展示(含空值处理)

解决SQL Server中查询患者首次就诊前两个诊断的问题

我来帮你搞定这个问题!你遇到的核心问题是自连接时用了RIGHT JOIN,导致没有第二个诊断的患者被过滤掉了,而且原查询的连接逻辑也有可以优化的地方。咱们来调整一下,给你两种可行的解决方案:

方法一:使用LEFT JOIN匹配第二个诊断

这种方法通过左连接保留所有有首次就诊第一个诊断的患者,即使他们没有第二个诊断:

SELECT 
    d1.PatID AS PatientNo,
    d1.EpNo,
    'DiagNo1 diagcode = ' + d1.DiagCode AS FirstDiagnosis,
    CASE 
        WHEN d2.DiagNo IS NOT NULL THEN 'DiagNo2 diagcode = ' + d2.DiagCode
        ELSE '(No second diagnosis)'
    END AS SecondDiagnosis
FROM spell s
INNER JOIN diagnosis d1 
    ON s.AdmNo = d1.AdmNo
LEFT JOIN diagnosis d2 
    ON d1.AdmNo = d2.AdmNo 
    AND d2.EpNo = d1.EpNo 
    AND d2.DiagNo = 2
WHERE 
    s.AdmDate >= '2018-05-25' 
    AND d1.EpNo = 1 
    AND d1.DiagNo = 1
ORDER BY d1.PatID

关键调整说明:

  • 用INNER JOIN先关联spell表和首次就诊的第一个诊断(d1.DiagNo=1),确保只获取符合日期范围的首次就诊记录
  • 用LEFT JOIN关联同一个就诊下的第二个诊断(d2.DiagNo=2),这样即使没有第二个诊断,d2的字段会返回NULL
  • 通过CASE WHEN处理空值场景,显示你需要的(No second diagnosis)提示
  • 去掉了不必要的DISTINCT和GROUP BY,因为我们已经限定了诊断编号,不会产生重复记录

方法二:使用条件聚合(更简洁的写法)

如果以后需要扩展到更多诊断,这种聚合的方式会更灵活:

SELECT 
    PatID AS PatientNo,
    EpNo,
    'DiagNo1 diagcode = ' + MAX(CASE WHEN DiagNo = 1 THEN DiagCode END) AS FirstDiagnosis,
    CASE 
        WHEN MAX(CASE WHEN DiagNo = 2 THEN DiagCode END) IS NOT NULL 
        THEN 'DiagNo2 diagcode = ' + MAX(CASE WHEN DiagNo = 2 THEN DiagCode END)
        ELSE '(No second diagnosis)'
    END AS SecondDiagnosis
FROM diagnosis d
INNER JOIN spell s 
    ON d.AdmNo = s.AdmNo
WHERE 
    s.AdmDate >= '2018-05-25' 
    AND d.EpNo = 1
    AND d.DiagNo IN (1,2)
GROUP BY PatID, EpNo
ORDER BY PatID

逻辑说明:

  • 用CASE WHEN筛选出DiagNo=1和DiagNo=2的诊断码,通过MAX函数提取对应的值(同一个就诊下每个诊断编号唯一)
  • 聚合后直接把两个诊断合并到同一行,空值场景同样用CASE WHEN处理提示信息

原查询的问题分析

你原来的脚本用了RIGHT JOIN diagnosis d2,这会导致只有存在第二个诊断的患者才会被返回,没有第二个诊断的患者会被过滤掉,这就是你无法处理无第二诊断患者的原因。另外DISTINCT和GROUP BY在这里是多余的,因为你已经限定了诊断编号,不会有重复记录。

示例结果

执行上述查询后,会得到类似你需要的输出:

PatientNo 123456 EpNo 1 | FirstDiagnosis: DiagNo1 diagcode = W234 | SecondDiagnosis: DiagNo2 diagcode = e3456
PatientNo 890765 EpNo 1 | FirstDiagnosis: DiagNo1 diagcode = R345 | SecondDiagnosis: (No second diagnosis)

内容的提问来源于stack exchange,提问作者SJG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 09:07:17