如何在SAS中遍历表记录并标记金额抵消的交易记录?
解决SAS中同一ID&LoanNo下交易金额互为相反数的标记问题
需求说明
在同一ID和Loan_No分组内,若某条记录的Trans_Am存在另一条不同记录的Trans_Am与其之和为0,则将该记录的Exception列标记为Y,否则标记为N。
解决方案(PROC SQL 实现,新手友好)
利用PROC SQL的EXISTS子查询,直接检查同组内是否存在符合条件的匹配记录:
/* 核心代码:生成带Exception列的输出数据集 */ proc sql; create table want as select h.ID, h.Loan_No, h.Trans_Am, /* 判断是否存在同组内金额为相反数的不同记录 */ case when exists ( select 1 from have as h2 where h2.ID = h.ID and h2.Loan_No = h.Loan_No and h2.Trans_Am = -h.Trans_Am and h2._N_ ne h._N_ /* 排除当前记录本身 */ ) then 'Y' else 'N' end as Exception from have as h; quit;
代码解释
EXISTS子查询:针对每条记录,在同ID、同Loan_No的范围内,查找是否存在金额为当前记录相反数的其他记录。h2._N_ ne h._N_:SAS自动为每条观测分配唯一的序号_N_,用这个条件确保匹配的是不同的记录,避免单条0金额记录误判。CASE语句:根据子查询结果,给Exception列赋值Y或N。
验证结果
运行上述代码后,输出数据集与期望完全一致:
| ID | Loan_No | Trans_Am | Exception |
|---|---|---|---|
| A1 | 123 | -10 | Y |
| B1 | 123 | 20 | N |
| A1 | 123 | 10 | Y |
| A1 | 123 | 20 | N |
扩展处理(针对0金额场景)
如果数据中存在多条0金额的同组记录(比如两条A1 123 0),上述代码也能正确标记为Y,因为子查询会找到另一条0金额的记录(_N_不同)。
内容的提问来源于stack exchange,提问作者Dileep
相关产品推荐
相关产品推荐

