簡體   English   中英

SAS proc sql do循環

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM