2017-11-22 6 views
-1

Im Folgenden ist der erste MakrocodeSAS proc SQL Iteration

%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 

ich auf zwei Dinge tun will. Setzen Sie die Werte von sno in ein neues Dataset wie z. B. .

no 
11 
12 
13 

Zweite I unter proc SQL iterieren wollen oben aufgelöst Makro sno auf nicht basierend auf, ich meine nach oben Werte es Schleife von 11,12 und 13 ohne Verwendung von Makros sein muss.

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

Also unten ist die iterierte proc SQL-Logik nach der Verwendung von oben aufgelösten Makros.

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; 

Ich möchte nicht oben proc SQL in Makro und Mend-Prozess setzen. Es muss weitergehen von.

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

Sie wollen Makro-ähnliche Funktionalität ohne Makros? Hast du DOSBLUB oder CALL EXECUTE angeschaut? Wahrscheinlich CALL EXECUTE. Es ist normalerweise keine gute Idee, Ihre Daten so zu teilen ... Sie werden wahrscheinlich jetzt eher eine Straße aller Makros als BY- oder GROUP-Verarbeitung gehen. – Reeza

Antwort

0

Der Weg zu Schleife wie folgt ohne ein Makro verwendet call execute. In den meisten Fällen führt die Verwendung eines Makros jedoch zu Code, der einfacher zu schreiben und zu verstehen ist. Wenn Sie weg aus irgendeinem Grund von Makros bleiben, könnten Sie erreichen, was Sie wie folgt beschreiben:

%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; 

Sie können durch nur darum, den Anruf ausführen direkt vor der output Anweisung in der sno_to_no Daten vereinfachen Schritt, abhängig von Ihren Bedürfnissen. Sie werden den sample Datenschritt, den ich hier zur Verfügung gestellt habe, natürlich nicht brauchen - ich habe ihn eingefügt, damit der Code für mein Beispiel läuft.