/**********************************************************************/
/********************************************************/
/* */
/* The following numeric variables and their values */
/* from the SASUSER.HOUSES data set are used in the */
/* example: */
/* */ */
/* SASUSER.HOUSES */
/* SQFEET BEDROOMS BATHS PRICE */
/* 1250 2 1.0 64000 */
/* 1190 1 1.0 65850 */
/* 1400 2 1.5 80050 */
/* 1810 4 3.0 107250 */
/* 1500 3 3.0 86650 */
/* 1615 4 3.0 94450 */
/* 1305 3 1.5 73650 */
/* 1390 3 2.5 79350 */
/* 1040 2 1.0 55850 */
/* 2105 4 2.5 127150 */
/* 1535 3 3.0 89100 */
/* 1240 2 1.0 69250 */
/* 720 1 1.0 34550 */
/* 1745 4 2.5 102950 */
/* 1860 2 2.0 110700 */
/**********************************************************************/
/* create an output data set and name the statistic */
/* result by which to order */
proc means data=sasuser.houses noprint;
output out=temp mean=;
/* transpose the data set so that each variable */
/* name becomes the value of _NAME_ and each mean */
/* the value of COL1 */
proc transpose data=temp(drop=_freq_ _type_) out=temp;
/* sort the data set so the means are in */
/* descending order */
proc sort data=temp out=temp;
by descending col1;
/* create a unique macro variable for each observation */
/* to record the order in which the variables should */
/* appear */
data _null_;
set temp end=last;
call symput('v'||left(put(_n_,3.)),_name_);
if last then call symput('max',put(_n_,3.));
run;
/* use macro to rewrite the PROC MEANS step using a */
/* VAR statement with the customized order of the */
/* variables and display the final ordering sequence */
%macro gencode;
options nonumber nodate nolabel;
proc means data=sasuser.houses mean std maxdec=0;
title "FINAL ORDERING SEQUENCE";
var
%do i=1 %to &max;
&&v&i
%end;
;
run;
%mend gencode;
/* invoke the macro */
%gencode
/**********************************************************************/
proc means data=sasuser.houses mean maxdec=0;
title "final ordering sequence";
var price sqfeet bedrooms baths;
run;
/**********************************************************************/
/* transpose SASUSER.HOUSES so that each variable */
/* name is the value of _NAME_ and each numeric value */
/* is the value COL1. This is accomplished using the */
/* BY statement to transpose each observation */
/* individually. */
proc transpose data=sasuser.houses
out=temp2(keep=_name_ col1);
by notsorted street;
var _numeric_;
/* Generate the final ordering sequence by using */
/* PROC SQL to first calculate the desired statistics */
/* and then order by the descending values of the mean */
/* statistic */
options label;
proc sql;
select _name_ label='Variable',
mean(col1) as mean label='Mean' format=12.,
std(col1) as std label='Std Dev' format=12.
from temp2
group _name_
order by mean desc;
run;
/**********************************************************************/