之間迭代循環,我被卡住的情況是,我有兩個數據集。SAS兩個數據集
一種含在客戶級的默認值的記錄,其中每行包括像ID_customer
,date_default
amount_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;
這不是一個問題,這是適當的堆棧溢出。我們很樂意幫助您解決您正在編寫的代碼,但這不是代碼編寫服務。 – Joe
嗨喬,我有一個代碼的例子,但我敢肯定,我在這裏做了很多錯誤的事情。但如果它可以幫助我在這裏發佈 –
我建議你爲每個支付添加一個新行而不是新列,並添加一個新的交易ID列以跟蹤它們。這將更容易管理。 – user667489