You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

现有代码的问题

  1. CASE逻辑顺序错误:前面的Group='A'/Group='B'会优先匹配,导致像ID1763这类多Color的ID永远只会返回'R',无法触发后续的'R/L'判断。
  2. JOIN后产生重复记录:work.have中ID1763有两条记录,JOIN后会让work.test中的对应ID也重复,无法实现去重需求。
  3. 未实现多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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 08:37:27