2017-08-30 86 views
0

之間迭代循環,我被卡住的情況是,我有兩個數據集。SAS兩個數據集

一種含在客戶級的默認值的記錄,其中每行包括像ID_customerdate_defaultamount_default列,和可變等於amount_default我需要爲可編輯的可變我稱之爲left_default

第二類包括付款,如果有的話,在客戶層面進行償還這些違約。該變量類似於默認值之一,如ID_customer,date_payment,amount_payment和變量等於amount_payment,我需要作爲ediatable,我打電話left_paymnet

我想要的是代碼迭代通過每行的默認表,併爲每個默認記錄它在支付表中是否存在由同一客戶支付的任何款項,與支付日期大於或等於默認的一個檢查。

的邏輯oldeast默認獲得報酬優先對於新

如果存在與上述標準的任何方式付款,則取決於所做那麼我應該填充新列的默認表中的付款金額,每次支付一次,直到默認金額全部覆蓋。

同時,如果付款額大於未付款的默認金額,那麼我應該更新left_payment列中剩餘的付款餘額後支付其餘的默認部分。

我想用一個例子更簡單。

讓我們說我們有

table default 

ID amount_default date_default left_defaullt 
1 5    01012015   5 
1 4    10012015   4 

table paymnet 

ID amoutn_payment date_paymnet left_paymnet 
1 3    15122015   3 
1 6    18012016   6 

因此,在第一次迭代的代碼首先應注重5歐元的第一默認值,然後尋找在付款臺付款應檢索來自第一線3歐元的付款和2歐元的第二行付款。所以這一次迭代後的結果應該是

default 

ID amount_default date_default left_defaullt payment1 datepayment1 
1 5    01012015  2    3  15122015 
1 4    10012015  4 

payment 

ID amoutn_payment date_paymnet left_paymnet 
1 3    15122015  0 
1 6    18012016  6 

作爲第一默認是不繳足第二次迭代應該創建以下結果

default 

ID amount_default date_default left_defaullt pay1 date1 pay2 datet2 
1 5    01012015  0    3 15122015 2 18012016 
1 4    10012015  4 

payment 

ID amoutn_payment date_paymnet left_paymnet 
1 3    15122015  0 
1 6    18012016  4 

爲第一默認值,如果全額支付,則迭代移至第二個默認值

​​

因此,作爲最終結果,我們知道每個默認的每個部分何時已經支付。

這涉及到SAS我假定有兩個通過兩個數據集,但不知道如何把一個相似的代碼,因爲它似乎在網絡沒有什麼太大的文檔做循環。

這裏我工作的代碼示例。很肯定它有很多個錯誤的,但作爲以提供我的問題的正確觀點:

data tot_imp;     
    input contract $ nie $ account_type $ fecha date9. missing_pago; 
    format fecha date9.; 
    datalines;   
1 xx cc 01SEP2017 5 
1 xx cc 04SEP2017 4 
;       
run; 


data pagos;     
    input contract $ nie $ account_type $ fecha date9. remain_pago; 
    format fecha date9.; 
    datalines;   
1 xx cc 09SEP2017 3 
1 xx cc 12SEP2017 2 
;       
run; 



data tot_imp_el; 
set tot_imp nobs=num1; 

do k=1 to num1; 

partial=0; 

do i=1 to num; 
set pagos (rename=(contract=con nie=nies account_type=type fecha=fechas)) nobs=num point=i; 

if con=contract and nies=nie and fechas>=fecha and remain_pago>0 then do; /* if the pago date is later than the impago and the same pago has not been used for other impagos*/ 

if missing_impago-remain_pago<=0 then do; /* if the pago pays all the impago */ 

call symput("cc", partial); 
call symput("pago","pago"&cc); 
call symput("fecha","fecha_pago"&cc); 

partial=partial+1; 
&pago=missing_pago; 
remain_pago=remain_pago-missing_pago; 
missing_pago=0 ; 
&fecha=fechas; 
drop con nies type fechas remaing_pago; 

leave; 

end; 

else do; 

call symput("cc", partial); 
call symput("pago","pago"&cc); 
call symput("fecha","fecha_pago"&cc); 

partial=partial+1; 
missing_pago=missing_pago-remain_pago; 
&pago=remaing_pago; 
&fecha=fechas; 
remain_pago=0; 

drop con nies type fechas remaing_pago; 

end; 

end; 

end; 

run; 
+0

這不是一個問題,這是適當的堆棧溢出。我們很樂意幫助您解決您正在編寫的代碼,但這不是代碼編寫服務。 – Joe

+0

嗨喬,我有一個代碼的例子,但我敢肯定,我在這裏做了很多錯誤的事情。但如果它可以幫助我在這裏發佈 –

+1

我建議你爲每個支付添加一個新行而不是新列,並添加一個新的交易ID列以跟蹤它們。這將更容易管理。 – user667489

回答

1

這似乎是一個令人困惑的格式把寬行的信息。如果你想要的東西基本上是默認值,並支付每個ID的運行臺賬,我認爲它會更容易讓數據在狹窄列。例如,下面交錯違約,他們支付(通過ID和日期),並創建一個運行餘額:

data default; 
    input ID amount date ddmmyy8.; 
    format date date9.; 
    cards; 
1 5 01012015 
1 4 10012015 
; 
run; 

data payment; 
    input ID amount date ddmmyy8.; 
    format date date9.; 
    cards; 
1 3 15122015 3 
1 6 18012016 6 
; 

data want; 
    set default (in=d) 
     payment (in=p) 
    ; 
    by id date; 
    if first.id then balance=0; 
    if d then do; 
    type='Default'; 
    balance+-amount; 
    end; 
    if p then do; 
    type='Payment'; 
    balance+amount; 
    end; 
run; 

proc print data=want; 
run; 

返回:

Obs ID amount   date balance  type 

1  1  5  01JAN2015  -5  Default 
2  1  4  10JAN2015  -9  Default 
3  1  3  15DEC2015  -6  Payment 
4  1  6  18JAN2016  0  Payment 
+0

嗨quentin。感謝您的答覆。然而,我需要在違約和支付之間的列協會作爲每個默認行可以代表一個「資本」或「利息」實體,所以我需要知道,如果支付已用於償還資本或利息違約 –

+0

我仍然喜歡行。但我的回答閃避了將每次付款分配到特定默認值的目標。我必須考慮更多。這是一個有趣的問題。 – Quentin

+0

昆廷,作爲旁邊的問題。我看到你使用'+'和'+ - '符號組合就像一種「保留」聲明。我從來沒有見過使用這些運算符的這個kand。你能告訴我它是如何在SAS中定義的,所以我可以在這個特定的用途上做一些搜索?謝謝 –