|
|
沙发

楼主 |
发表于 2008-9-16 11:20:56
|
只看该作者
Re: 求助高手:如何根据配制表,来抽取数据,组成宽表?
data class1(rename=(sex=sex1 age=age1 height=height1 weight=weight1));
set sashelp.class;
run;
data class2(rename=(sex=sex2 age=age2 height=height2 weight=weight2));
set sashelp.class;
run;
data class3(rename=(sex=sex3 age=age3 height=height3 weight=weight3));
set sashelp.class;
run;
data confect;
input storeName $ tabName $ colName $ ;
DATALINES;
sashelp class name
sashelp class age
work class1 age1
work class1 sex1
work class2 sex2
work class2 age2
work class3 height3
work class3 age3
work class3 weight3
run;
options mprint mlogic;
%macro meageTable(tab,tid);
%let dsid=%sysfunc(open(&tab,i));
%let Totnum=%sysfunc(attrn(&dsid,NOBS));
%let lcname= twhere= stname= storetable= ;
%do seq= 1 %to %eval(&Totnum);
%let rc=%sysfunc(fetchobs(&dsid,&seq));
%let store=%sysfunc(getvarc(&dsid,1));
%let tname=%sysfunc(getvarc(&dsid,2));
%let cname=%sysfunc(getvarc(&dsid,3));
data _null_;
call symput('storetable',"&store"||"."||"&tname"||" "||"&store"||"&tname");
run;
%if &seq=1 %then %do;
data _null_;
call symput('stname',"&storetable");
call symput('lcname',"&tname"||"."||"&cname");
call symput('twhere',"&store"||"&tname"||"."||"&tid");
run;
%end;
%else %do;
%let a=%index("&stname",&storetable);
%if &a>0 %then %do;
data _null_;
call symput('lcname',"&lcname" ||","||"&tname"||"."||"&cname");
run;
%end;
%else %do;
data _null_;
call symput('stname',"&stname" || "," || "&storetable");
call symput('lcname',"&lcname" ||","||"&tname"||"."||"&cname");
call symput('twhere',"&twhere"||"="||"&store"||"&tname"||"."||"&tid");
run;
%end;
%put "lcname============================" &lcname;
%put "stname============================" &stname;
%put "twhere============================" &twhere;
%end;
%end;
proc sql;
create table classall as
select &lcname from &stname
where &twhere;
quit;
%mend meageTable;
%meageTable(work.confect,name);
这是我写的代码,功能是实现了,但觉得代码不够简化,大家指教一下,那些地方可以优化的? |
|