00001
00021
00022
00023
00024
00025 %MACRO generate(
00026 data =
00027 ,by =
00028 ,out =
00029 );
00030
00031
00032 %local d_temp1 d_temp2;
00033 data; run; %let d_temp1=&syslast;
00034 data; run; %let d_temp2=&syslast;
00035 %local i count bycount;
00036
00037
00038 proc sort data=&data out=&d_temp1;
00039 by &by;
00040 run;
00041 %if &syserr %then %do;
00042 %put ERROR: Macro Generate: data= or by= specified incorrectly;
00043 %return;
00044 %end;
00045
00046
00047 proc means noprint data=&d_temp1(keep=&by);
00048 by &by;
00049 output out=&d_temp2;
00050 run;
00051
00052 data _null_;
00053 set &d_temp2 nobs=count;
00054 call symput ("count", compress(put(count,8.)));
00055 stop;
00056 run;
00057 %do i=1 %to &count;
00058 %local label&i;
00059 %end;
00060
00061
00062 data _null_;
00063 set &d_temp2 end=eof;
00064 array t(1) $ 200 _temporary_;
00065 t(1) = 'Dataset for';
00066 %let i=1;
00067 %do %while(%scan(&by,&i) ne %str());
00068 %if &i>1 %then %do;
00069 t(1) = trim(t(1)) !! ',';
00070 %end;
00071 t(1) = trim(t(1)) !! " %scan(&by,&i)=" !! trim(left(vvalue(%scan(&by,&i))));
00072 %let i = %eval(&i+1);
00073 %end;
00074 %let bycount=%eval(&i-1);
00075 t(1) = trim(t(1)) !! ' (' !! compress(put(_freq_,8.)) !! ' observations)';
00076 call symput ('label' !! compress(put(_n_,8.)), trim(t(1)));
00077 run;
00078
00079
00080 data %do i=1 %to &count; &out&i (label="&&label&i") %end; ;
00081 set &d_temp1;
00082 by &by;
00083 array t(1) _temporary_;
00084 if first.%scan(&by,&bycount) then t(1)+1;
00085 select(t(1));
00086 %do i=1 %to &count;
00087 when(&i) output &out&i;
00088 %end;
00089 end;
00090 run;
00091
00092 proc datasets lib=work nolist;
00093 delete %scan(&d_temp1,2,.) %scan(&d_temp2,2,.);
00094 quit;
00095 %MEND generate;