在一个数据步骤中将多个数据集与条件合并?

问题描述:

我有3点是由一个ID列在一个数据步骤中将多个数据集与条件合并?

版本SAS 9.2

D1(2个COLS)(ID栏是唯一的)

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

D2(3 COLS)

联的数据集
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 COLS)

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

我想具有从所有数据集的cols的结果数据集和所述标准是

  1. 值应该为从D1 81或82和如果记录仅包含具有“代码” 651“行”,然后我们将它从最终数据集中排除。 从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可以将所有的逻辑

**

编辑10/2 0/2017

**

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

我需要在我的第二个proc sql语句中获取D2中的记录,并非所有'行都有'''代码'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

请发布您到目前为止的尝试,包括您的代码和日志以及您遇到的问题。 – Reeza

+1

您不可能一步完成此输出。这意味着最终的结果是通过将三个表中的表一对一地进行匹配而产生的,因此'data'步'merge';但是你的第二个条件将需要一些SQL。 – user2877959

+0

这个问题需要更多的澄清。代码如何出现在结果文件中,并排除所有**和**条件?也许你的意思是它被排除在** D1和D2 **之间,而不是D2和D3? – pinegulf

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

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; 
+0

如何从D1获取D2的所有记录(其中值= 81/82)如果“ID”的所有'行'在651之一中都有'代码'值,则排除记录,652,655或656,并希望包括其他一切。如果至少有一个'ID''行'有一个代码不在651,652,655或656,那么我想包括'ID'的所有'行' – user176047

+0

@ user176047感谢您的澄清。即使这样,这个问题似乎超出了我的技能。对不起,祝你好运。 – pinegulf

+0

我通过ODBC将它导出到SQL服务器,并使用T-SQL进行提取。 – user176047