SAS IF语句运行报ERROR 180-322错误 代码异常排查求助
SAS IF语句报错ERROR 180-322问题排查与修复
错误原因汇总
- 误用子集IF语句:代码中
if a;if b;这类写法是SAS的子集过滤语法,执行后会直接删除所有a=0的观测,后续针对b、c等数据集的判断逻辑完全无法触发,你需要的是分支判断语法if a then do;。 - 语法不完整:倒数第二行
if a or b or c or d or e or f后缺少分号和执行块标识,是触发ERROR 180-322的直接原因。 - 变量名错误:
- d表判断的第一行赋值变量为
atl_indd,else分支却写了atl_indd1,变量不匹配 else atl indd3 = 0;中变量名缺少下划线,正确应为atl_indd3- 后续求和用的
atl_inda、atl_indb、atl_inde、atl_indf等变量未定义,你之前只生成了atl_inda1、atl_inda2这类变量,且e、f表逻辑中重复给同一个atl_ind赋值会导致覆盖。
- d表判断的第一行赋值变量为
- 逻辑冲突:多个表匹配同一
clnt_no的场景下,子集IF会直接丢弃匹配多表的观测,和你最后要判断a~f任意存在的逻辑矛盾。
修正后代码
data tmp_final_tab; merge data.final_alerts_ramts(in=a) data.final_alerts_repamts(in=b) data.final_alerts_passthru(in=c) data.final_alerts_wires(in=d) data.final_alerts_low_volume(in=e) data.final_alerts_bhvr(in=f); by clnt_no; /* 初始化所有指标变量为0,避免缺失值 */ atl_inda1=0;atl_inda2=0;atl_indb1=0;atl_indb2=0;atl_indc=0; atl_indd1=0;atl_indd2=0;atl_indd3=0;atl_inde=0;atl_indf=0;btl_ind=1; /* 用do块做分支判断,不过滤观测 */ if a then do; if pamt_activity_cr >= &rnd_pct_atl then atl_inda1 = 1; if pamt_activity_dr >= &rnd_pct_atl then atl_inda2 = 1; end; if b then do; if pamt_activity_cr >= &rnd_pct_atl then atl_indb1 = 1; if pamt_activity_dr >= &rnd_pct_atl then atl_indb2 = 1; end; if c then do; if (ptam/total_Amount) * 100 >= &pt_pct_atl then atl_indc = 1; end; if d then do; if tot_amt_wire >= &hrc_wire_amt_atl then atl_indd1 = 1; if tot_in_amt >= &wire_in_cnt_amt_atl then atl_indd2 = 1; if tot_out_amt >= &wire_out_cnt_amt_atl then atl_indd3 = 1; end; if e then do; if tot_amt_lv >= &lv_amt_atl then atl_inde = 1; end; if f then do; if tot_amt_bhvr >= &bhvr_w_hist_atl then atl_indf = 1; end; /* 修正变量求和逻辑 */ if sum(atl_inda1, atl_inda2, atl_indb1, atl_indb2, atl_indc, atl_indd1, atl_indd2, atl_indd3, atl_inde, atl_indf) > 0 then btl_ind = 0; run;
内容的提问来源于stack exchange,提问作者lookingforCodeAssists
相关产品推荐
相关产品推荐

