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
相关产品推荐
相关产品推荐

