SAS PROC SQL多WHERE条件查询错误排查与修正方法
SAS PROC SQL多条件查询错误排查与修正方案
原始代码错误清单
- 表关联逻辑断裂:4张表的关联缺少统一关联条件,t1、t2关联后没有和t3、t4建立关联,会生成无效笛卡尔积或直接关联失败,需要补充t3与主表的关联逻辑。
- IN子句语法错误:IN操作符后多个枚举值需用逗号分隔,而非
and,原写法in ("243tab" and "246tab")会被判定为布尔运算,无法完成枚举匹配。 - BETWEEN语法错误:
between前不需要加等号,原写法t1.year=between不符合语法规范;如果t1.year是数值型字段,不需要给年份值加双引号。 - 字段归属不明确:
count、disease_code、nm_cd等字段未指定所属表,会触发字段歧义报错。 - 函数名错误:SAS内置子串截取函数为
substr而非stubstr,如果是左匹配药品编码需要补充截取起始位置和长度参数。 - 业务逻辑不匹配:若要求患者同时服用过两种指定药物,仅用IN子句只能匹配到服用过其中一种的患者,需要补充分组后的去重计数判断;首次用药(用药次数=1)的判断如果是统计得到的指标,不能直接在WHERE子句过滤,需要用HAVING子句处理聚合结果。
- SELECT与GROUP BY逻辑不匹配:仅按
index_num分组,SELECT子句中R_key、patient_name未聚合也未加入分组,返回结果不符合预期。
修正后代码
以下代码默认字段归属:disease_code属于t1表、nm_cd属于t4表、4张表关联键均为index_num、year为数值型字段,可根据实际表结构调整字段归属。
option compress=yes; libname p "/user/temp/data_source"; proc sql; create table m_join as select t1.index_num, t1.R_key, t1.patient_name from p.m1 as t1 /* 补全4张表的关联逻辑 */ inner join p.m2 as t2 on t1.index_num = t2.index_num inner join p.m3 as t3 on t1.index_num = t3.index_num inner join p.m4 as t4 on t1.index_num = t4.index_num where t1.disease_code = "I48" and t1.year between 2010 and 2021 /* 若nm_cd不需要截取子串可直接写t4.nm_cd in ("243tab","246tab") */ and substr(t4.nm_cd,1,6) in ("243tab","246tab") group by t1.index_num, t1.R_key, t1.patient_name having /* 若仅要求首次用药为其中一种,保留该行;若要求首次同时服用两种药,替换为count(distinct t4.nm_cd) =2 */ count(distinct t4.nm_cd) = 1 ; quit;
补充说明
如果原表已经预计算好每个患者的用药次数字段count,可将HAVING子句的判断规则替换为having t4.count =1即可。
内容的提问来源于stack exchange,提问作者Plutos
相关产品推荐
相关产品推荐

