2016-10-15 4 views
0

В настоящее время я работаю над проектом дебиторской задолженности по кредитным картам. нужна помощь от специалиста, чтобы увидеть, если это может произойти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; 

этот код генерирует 15 переменную из delq_36_rev

delq_36_rev выглядит xxxxxxxxxxxxxxx (где 0 < = х < = 7) поэтому delq_i выглядит как xx

вещь, который я хочу начать, начинается с здесь.

от delq_1 ~ delq_15 Я хотел бы дать оценку на основе чисел

(например. 01 = 1 балл, 12 = 2 балла, 23 = 3 балла)

но я бы также сочетающие оценки вообще

, так что я хотел бы написать цикл сделать, как

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 

помогите пожалуйста !!

ответ

0

Рассмотрите возможность использования оператора обновления SQL с логикой CASE в макросе. Но сначала добавьте 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; 
1

Если я вас правильно понимаю, вы можете сделать все это легко в одном шаге данных, не прибегая к макросам:

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;