Saturday, November 21, 2015

SAS: SQLOBS and creating macro variables within PROC SQL



I just came across the automatic macro variable SQLOBS...this example is fully self-contained...just copy it into SAS and run...


* ------------------------------------------------------------ ;
DEMO USE OF SQLOBS WHEN CREATING MACRO VARIABLES FROM DATA
* ------------------------------------------------------------ ;

* CREATE TEST DATASET... ;
data work.grandkids;
input name $ gender $;
datalines;
Kamina F
Raelani F
Elliott M
Calliope F
Henni F
;
run;

* SHOW TEST DEMO DATASET... ;
proc print data=work.grandkids;
run;

* CREATE MACRO VARIABLES THE OLD WAY... ;
data _null_;
set work.grandkids end=eof;
call symput("name" || trim(left(_n_)), name);
call symput("gender" || trim(left(_n_)), gender);
if eof then call symput("howmany", trim(left(_n_)));
run;

%put howmany=&howmany;

* SELECT GRANDDAUGHTERS (ONLY)... ;
data work.granddaughters (keep=name);
attrib name length=$8;
do i = 1 to &howmany;
    if (symget("gender" || trim(left(i))) = "F") then do;
        name = symget("name" || trim(left(i)));
        output;
    end;
end;
run;

* SHOW GRANDDAUGHTERS... ;
proc print data=work.granddaughters;
run;

* CREATE MACRO VARIABLES THE NEW WAY... ;
proc sql noprint;
select name, gender
into :name1 - :name999, :gender1 - :gender999
from work.grandkids;
quit;
run;

* SHOW SQLOBS...THE WHOLE POINT OF THIS EXAMPLE... ;
%put sqlobs=&sqlobs;

* REASSIGN TO SQLOBS TO HOWMANY AND RUN OLD CODE AGAIN... ;
%let howmany = %eval(&sqlobs);
%put howmany=&howmany;

* SELECT GRANDDAUGHTERS (ONLY)... ;
data work.granddaughters (keep=name);
attrib name length=$8;
do i = 1 to &howmany;
    if (symget("gender" || trim(left(i))) = "F") then do;
        name = symget("name" || trim(left(i)));
        output;
    end;
end;
run;

* SHOW GRANDDAUGHTERS... ;
proc print data=work.granddaughters;
run;





No comments:

Post a Comment