2017-10-20 72 views
-1

我有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

回答

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

相關問題