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

Sas 在一个数据步骤中合并具有条件的多个数据集?,sas,Sas,我有3个由ID列链接的数据集 SAS 9.2版 D1(2列)(ID列是唯一的) D2(3列) D3(2列) 我想要一个结果数据集,其中包含来自所有数据集的COL,并且条件是 从D1开始,值应为81或82 和如果记录仅包含D2中带有“代码”651、652、655或656的“行”,则我们将其从最终数据集中排除。 和D3中满足上述两个标准的所有记录 结果数据集如下所示 ID Value Line Code Vcode 2 81 1 650 A 2 81 2 652 C 3 82 1 651 B 3 8

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

SAS 9.2版

D1(2列)(ID列是唯一的)

D2(3列)

D3(2列)

我想要一个结果数据集,其中包含来自所有数据集的COL,并且条件是

  • 从D1开始,值应为81或82 如果记录仅包含D2中带有“代码”651、652、655或656的“行”,则我们将其从最终数据集中排除。 D3中满足上述两个标准的所有记录
  • 结果数据集如下所示

    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获取记录,其中并非所有的行都有四个“代码”651、652、655或656中的一个,但我认为我的proc-sql不正确。我想把这些排除在外。这就是为什么我的结果数据集没有“ID”为1和4的记录。就这样做而言,一个datastep很好,但多个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;
    

    我想出了这个,它产生了几乎所需的。结果。我希望你能修改它以满足你的需要

    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;
    

    请发布您迄今为止的尝试,包括您的代码和日志以及您遇到的问题。您不太可能在一个步骤中获得此输出。这意味着最终结果是通过将三个表中的表一一匹配而产生的,因此
    数据
    步骤
    合并
    ;然而,您的第二个条件将需要一些SQL。这个问题需要进一步澄清。代码如何出现在结果文件中,并在所有情况下被排除?也许你的意思是它被排除在D1和D2的连接中,而不是D2和D3?@Reeza-谢谢你的评论。我已经进一步澄清了我的问题-谢谢你的评论。我进一步澄清了我的问题:如果一个“ID”的所有“行”在651、652、655或656中的一个中有“代码”值,并且希望包括所有其他内容,那么如何从D2中获取ID的所有记录(其中值=81/82),其中排除记录。如果至少有一个“ID”的“行”的代码不在651、652、655或656中,那么我想包括该“ID”的所有“行”@user176047感谢您的澄清。即使这样,这个问题似乎也超出了我的能力。对不起,祝你好运。我通过ODBC将其导出到SQL server,并使用T-SQL进行提取。
    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 -
    
    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;
    
    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;