在一个数据步骤中合并具有条件的多个数据集?

时间:2017-10-20 00:48:38

标签: sas

我有3个由ID列链接的数据集

版本SAS 9.2

D1(2个cols)(ID col是唯一的)

ID Value
1 81
2 81
3 82
4 82
5 81
6 78

D2(3门)

ID Line Code
1 1 651
1 2 652
1 3 655
2 1 650
2 2 652
3 1 651
3 2 655
3 3 651
3 4 658
4 1 651
4 2 651

D3(2门)

ID Vcode
1 A
1 B
2 A
2 C
3 B
3 D

我想要一个结果数据集,其中包含来自所有数据集的cols,标准为

  1. D1的值应为81或82 如果记录仅包含来自D2的“代码”651,652,655或656的“行”,则我们将其从最终数据集中排除。 来自D3的所有符合以上两项标准的记录
  2. 结果数据集就像

    ID Value Line Code Vcode
    2 81 1 650 A
    2 81 2 652 C
    3 82 1 651 B
    3 82 2 655 D
    3 82 3 651 -
    3 82 4 658 -
    

    我正在为每个步骤编写数据步骤,但我正在寻找一个可以组合所有逻辑的数据步骤或proc SQL

    **

      

    2017年10月20日编辑

    **

    以下是我所做的。数据集D1 ... D3只是我问题的别名,下面是实际的。

    我需要在我的第二个proc sql语句中从D2获取记录,其中并非所有'line'都具有四个'代码'651,652,655或656中的一个,但我认为我的proc sql不正确。我想排除那些。这就是为什么我的结果数据集没有'ID'为1和4的记录。就这样做而言,一个datastep很好,但不止一个很好。

    libname SAF "F:\Databases\SAF\sasdata\2015";
    libname  out "F:\projects\0122_Oct17\SASDATA"; 
    
    
    Options symbolgen mlogic mprint; 
    Options obs=max;  
    
    proc contents data=SAF.Hosp_claimsj_lds;
    run;
    
    
    Data OUT.Hospice_TOB_81x82x;
        Set SAF.Hosp_claimsj_lds (keep = CLAIM_NO PRVDR_NUM CLM_THRU_DT CLM_FAC_TYPE_CD CLM_SRVC_CLSFCTN_TYPE_CD CLM_FREQ_CD CLM_PMT_AMT);
        WHERE CLM_FAC_TYPE_CD = '8' and CLM_SRVC_CLSFCTN_TYPE_CD in ('1','2'); /* TOB 81x and 82x */
        TOB = CATT(OF CLM_FAC_TYPE_CD CLM_SRVC_CLSFCTN_TYPE_CD CLM_FREQ_CD);
    Run;
    
    proc sql;
        create table out.Hospice_TOB_81x82x_ValCd as
        select  *
     from SAF.Hosp_instval_lds
        Where Claim_no in (Select Claim_no from out.Hospice_TOB_81x82x);
    quit;
    
    
    proc sql;
        create table out.Hospice_TOB_81x82x_RevCd as
        select  *
     from SAF.Hosp_revenuej_lds
        Where Claim_no in (Select Claim_no from out.Hospice_TOB_81x82x)
              and REV_CNTR NOTIN ('651', '652', '655','656');
    quit;
    

1 个答案:

答案 0 :(得分:0)

我想出了这个,几乎产生了所需要的。结果。我希望您能够根据自己的需要进行修改。

data D1;
    input ID Value @@;
    cards; 
    1 81 2 81 3 82 4 82 5 81 6 78
    ;
run;

data D2; 
    input ID Line Code @@;
    cards;
    1 1 651 1 2 652 1 3 655 2 1 650 2 2 652 3 1 651 
    3 2 655 3 3 651 3 4 658 4 1 651 4 2 651
    ;
run;

data D3;
    input ID Vcode $ @@;
    cards; 
    1 A  1 B 2 A 2 C 3 B 3 D
    ;
ruN;

data one;
    merge D1(in=a) D2(in=b); 
    by id;
    if a and b;
    if value in (81 82);
    if code not in (651 652 655 656 );
run;
data two; 
    merge D2 D3;
    by id;
run;

data almost wanted;
    merge one (in=a) two(in=b);
    by id ;
    if a;
run;