[英]SAS proc sql do loop
我目前正在從事信用卡拖欠項目。 需要專家的幫助,看看是否可能發生
所以我有這個代碼
data mcmc2;
set work.mcmc;
array delq(1:15) $2. delq_1-delq_15;
do i = 1 to 15;
delq(i) = substr(delq_36_rev, (i),2) ;
put @1 delq(i);
end;
run;
此代碼從delq_36_rev生成15個變量
delq_36_rev看起來像xxxxxxxxxxxxxxx(其中0 <= x <= 7),所以delq_i看起來像xx
我想做的事情從這里開始。
來自delq_1〜delq_15我會根據數字給出分數
(例如01 = 1點,12 = 2點,23 = 3點)
但我也將分數全部合並
所以我想寫一個do循環
do i = 1 to 15
when delq_i ="70" then score_i=-6
when delq_i in ("71","60") then score_i=-5
when delq_i in ("72","61","50") then score_i=-4
when delq_i in ("73","62","51","40") then score_i=-3
when delq_i in ("74","63","52","41","30") then score_i=-2
when delq_i in ("76","65","65","64","54","53","43","42","32","31","20","21","10") then score_i=-1
when delq_i ="00" then score_i=0
when delq_i in ("01","11","22","33","44","55","66","77" then score_i=1
when delq_i ="12" then score_i=2
when delq_i ="23" then score_i=3
when delq_i ="34" then score_i=4
when delq_i ="45" then score_i=5
when delq_i ="56" then score_i=6
when delq_i ="67" then score_i=7
sum(delq_1-delq_15) as delq_score
請幫忙!!
如果我對您的理解正確,則可以在一個數據步驟中輕松完成所有這些操作,而無需借助宏:
data want;
set set work.mcmc;
array delq(15) $2. delq_1-delq_15;
array score(15);
do i = 1 to dim(delq);
delq[i] = substr(delq_36_rev,i,2);
select(delq[i]);
when("70") score[i]=-6;
when("71","60") score[i]=-5;
/*etc*/
otherwise call missing(score[i]);
end;
end;
delq_score = sum(of score[*]);
run;
考慮在宏中使用帶有CASE
邏輯的SQL更新語句。 但首先要添加score_1-score_15
列以及您的delq列。 然后在宏中,迭代更新這些得分列,並在最后一個數據步驟中將它們全部添加到score
,最后刪除15個得分項。
data mcm2;
set work.mcmc;
array delq(1:15) $2. delq_1-delq_15;
array score(1:15) score_1-score_15;
do i = 1 to 15;
delq(i) = substr(delq_36_rev, (i),2) ; * delq_1-delq_15;
put @1 delq(i);
score(i) = .; * score_1-score_15;
end;
run;
%macro loopSQL;
%do i = 1 %to 15;
proc sql;
UPDATE mcm2
SET score_&i =
CASE
WHEN delq_&i ="70" THEN -6
WHEN delq_&i in ("71","60") THEN -5
WHEN delq_&i in ("72","61","50") THEN -4
WHEN delq_&i in ("73","62","51","40") THEN -3
WHEN delq_&i in ("74","63","52","41","30") THEN -2
WHEN delq_&i in ("76","65","65","64","54","53","43","42","32","31","20","21","10") THEN -1
WHEN delq_&i = "00" THEN 0
WHEN delq_&i in ("01","11","22","33","44","55","66","77") THEN 1
WHEN delq_&i ="12" THEN 2
WHEN delq_&i ="23" THEN 3
WHEN delq_&i ="34" THEN 4
WHEN delq_&i ="45" THEN 5
WHEN delq_&i ="56" THEN 6
WHEN delq_&i ="67" THEN 7
ELSE .
END;
quit;
%end;
%mend loopSQL;
%loopSQL; * run macro;
data work.mcm2;
set work.mcm2;
score = sum(of score_1-score_15);
drop score_1-score_15;
run;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.