如何使用Proc SQL的Case When条件处理同一ID的多行数据
问题:为变量创建三类指标并处理重复ID
原始数据集(work.have)
ID Group Color 1763 A Red 1763 A Yellow 6372 B Red 0498 A Red
需求
识别同一ID对应的Color列(仅含Red/Yellow)存在不同值的情况,添加专属标记,最终输出去重后的ID数据集。
现有Proc SQL代码
proc sql; create table want as select a.ID a.Qty (case when b.Group = 'A' then 'R' when b.Group = 'B' then 'L' when b.Color = 'Red' AND b.Group ='A' then 'R/L' when b.Color = 'Yellow' AND b.Group = 'B' then 'R/L' else 'X' end) as Category from work.test a left join (select distinct ID, Group, Color from work.have) b on a.ID=b.ID ; quit;
期望输出(work.want)
ID Qty Category 1763 28 R/L 6372 30 L 3908 41 X 0498 32 R
现有代码的问题
- CASE逻辑顺序错误:前面的
Group='A'/Group='B'会优先匹配,导致像ID1763这类多Color的ID永远只会返回'R',无法触发后续的'R/L'判断。 - JOIN后产生重复记录:
work.have中ID1763有两条记录,JOIN后会让work.test中的对应ID也重复,无法实现去重需求。 - 未实现多Color判断逻辑:现有代码完全没针对同一ID下存在不同Color值的情况做判断,不符合需求核心要求。
修正后的解决方案
第一步:先汇总每个ID的Group及Color分布情况
先对work.have分组,统计每个ID的颜色种类数,同时保留所属Group:
proc sql; create table have_summary as select ID, Group, count(distinct Color) as color_count /* 统计该ID下不同Color的数量 */ from work.have group by ID, Group; quit;
第二步:关联生成最终去重的结果表
关联work.test和汇总表,按需求生成Category,并通过分组确保ID唯一:
proc sql; create table want as select a.ID, a.Qty, case when b.ID is missing then 'X' /* 无匹配ID的情况 */ when b.color_count > 1 then 'R/L' /* 同一ID下有多种Color */ when b.Group = 'A' then 'R' when b.Group = 'B' then 'L' else 'X' end as Category from work.test a left join have_summary b on a.ID = b.ID group by a.ID, a.Qty; /* 强制去重,确保每个ID只出现一次 */ quit;
内容的提问来源于stack exchange,提问作者B K
相关产品推荐
相关产品推荐

