SAS:如何使用一个表中的结果根据第二个表

时间:2015-11-02 20:54:20

标签: sas enterprise-guide

我正在尝试整理一份人员列表以及以独特组合提交申请的次数。

表A结构设置如下:

     PERSON_ID    CLAIM_ID   
     123456       A123C   
     123456       Z321C   
     123456       B123C   
     111111       A123C   
     111111       Z321C   

表B结构设置如下:

     PERSON_ID    CLAIM_1    CLAIM_2    CLAIM_3   
     123456       A123C      Z321C      B123C   
     123456       A123C      B123C   
     123456       B123C   
     111111       A123C      Z321C   
     111111       A321C 

我需要制作的结果如下:

     PERSON_ID    CLAIM_ID    NUM_TIMES_CLAIMED   
     123456       A123C         2   
     123456       Z321C         1   
     123456       B123C         3   
     111111       A123C         1   
     111111       Z321C         2   

我可以在MSAccess中使用带有开放记录集的循环来做这件事我已经尝试过研究如何打开SAS记录集来循环(宏)它但我似乎无法理清如何正确实现它。

有什么想法吗?

修改
我认为我必须采取的步骤是:

步骤1 - Isoloate单个人不同的CLAIM_ID列表
第2步 - 对于每个CLAIM_ID,扫描25个变量以找到匹配项 第3步 - 每次找到匹配时计数
第4步 - 保存观察(PERSON_ID,CLAIM_ID,NUM_TIMES_CLAIMED)

从VBA到SAS我似乎无法隔离单个人的不同声明列表并循环遍历表B中的25个变量中的每一个

以下是我用来评估一项索赔是否与另一项索赔相关的内容,我认为我需要以某种方式实现自动化:

data LOCALPC.SEL_ASMT_DEL;
  SET LOCALPC.FY2014_CC_FINAL;
    ARRAY FSC{25} $ FSC1-FSC25;
    DO I = 1 TO 25;
        IF FIND (FSC{I},'A123A') THEN 
            DO N = I+11 TO 25;
                IF FIND (FSC{J},'Z321A') THEN
                    OUTPUT;
            END;
    END;
RUN;

2 个答案:

答案 0 :(得分:0)

不确定为什么你会使用循环来回答直接连接。现在,如果您首先将表格B转换为更加规范化的形式,那将更容易。

首先将您的样本数据导入数据集:

data A ;
length PERSON_ID CLAIM_ID $10 ;
input PERSON_ID    CLAIM_ID   ;
cards;
123456       A123C   
123456       Z321C   
123456       B123C   
111111       A123C   
111111       Z321C   
;;;;
data B ;
length PERSON_ID CLAIM_1 - CLAIM_3 $10 ;
input PERSON_ID    CLAIM_1-CLAIM_3   ;
cards;
123456       A123C      Z321C      B123C   
123456       A123C      B123C   .
123456       B123C . .  
111111       A123C      Z321C   .
111111       A321C ..
;;;;

然后只需加入表格并计算匹配的行数。

proc sql ;
  create table want as 
    select a.*,count(*) as num_times_claimed
    from a 
    left join b
    on a.person_id = b.person_id 
    and (a.claim_id = b.claim_1
      or a.claim_id = b.claim_2
      or a.claim_id = b.claim_3
         )
    group by 1,2
    order by 1,2
  ;
quit;
proc print; run;

结果:

   PERSON_
     ID       CLAIM_ID    num_times_claimed

   111111      A123C          1
   111111      Z321C          1
   123456      A123C          2
   123456      B123C          3
   123456      Z321C          1

答案 1 :(得分:0)

我认为您可以从“表A”获得结果,假设所有声明都以行的形式插入到表A中,并且对于person_id存在重复声明。

  intent1.putExtras("blabla",bundles);

如果没有,请描述您的表格结构和它们之间的关系,以便我们为您提供帮助。