2017-11-22 62 views
-1

は私が行うには二つのことをしたい最初のマクロコードのSASのproc SQL以下の繰り返し

%let bdate='01JAN2001'd ; 
%let bno=11; 
%let date='01JAN2001'd ; 
%let sno=%eval(&bno + %sysfunc(intck(month,&bdate,&date))); 
%let no=%eval(&sno.+2) 
%put &=date &=sno &=no; 
DATE='01JAN2001'd SNO=11 no=13 

です。 snoからnoへの値を、 のような新しいデータセットに入れます。

​​

それはマクロを使用せずに、11,12および13からループにする必要があり、上記の値ごとに、私はノーに解決マクロSNOの上に基づいて、プロシージャ・SQLの下に反復したい第二には、私が意味します。

proc sql; 
create table new &no as select from sample where deal in (&no); 
quit; 

上記の解決済みのマクロを使用した後は、以下の反復proc SQLロジックがあります。

proc SQL; 
create table new11 as select from sample where deal in (11); 
quit; 

proc SQL; 
create table new12 as select from sample where deal in (12); 
quit; 

proc SQL; 
create table new13 as select from sample where deal in (13); 
quit; 

私は上記のproc SQLをマクロに追加して処理したくありません。それはから続けなければならない。

%put &=date &=sno &=no; 
+0

マクロを使用しないマクロのような機能が必要ですか? DOSUBLやCALL EXECUTEを見ましたか?おそらくCALL EXECUTE。そのようなデータを分割するのは良い考えではありません.BYやGROUPの処理ではなく、すべてのマクロをロードすることになります。 – Reeza

答えて

0

このようにマクロを使用せずにループする方法は、call executeです。しかし、ほとんどの場合、マクロを使用すると、書き込みや理解が容易なコードになります。

%let bdate='01JAN2001'd ; 
%let bno=11; 
%let date='01JAN2001'd ; 
%let sno=%eval(&bno + %sysfunc(intck(month,&bdate,&date))); 
%let no=%eval(&sno + 2); 
%put &date &sno &no; 

data sno_to_no; 
    do no = &sno to &no; 
     output; 
    end; 
run; 

data sample; 
    set sno_to_no; 
    deal = no; 
run; 

data _null_; 
    set sno_to_no; 
    call execute('proc sql; create table new'||strip(no)||' as select * from sample where deal in ('||strip(no)||'); quit;'); 
run; 

あなただけsno_to_noデータでoutput文の前に権利を実行するコールを置くことによって簡素化することができる場合がありますあなたには、いくつかの理由で離れてマクロから滞在している場合、あなたはこのように記述しているものを達成できましたあなたの必要に応じて、ステップ。明らかに、私がここで提供したsampleのデータステップは必要ありません。私のコードは私の例のために実行されるようにしました。