yongyitian 发表于 2013-4-20 23:54
因不知道你想要 的结果是什么,所以给出了三种结果。
三百个数据集,太复杂了。
谢谢,受你用SQL的启发,我解决这个问题了。
%MACRO repeatmake;
data earnrate_count;
set stock.earnstatics;
if buydate>=19203 and buydate<selldate;
run;
data all_earnstatics(keep=num buydate selldate earnrate);
set earnrate_count;
run;
proc sort data=earnrate_count nodupkey;
by buydate;
run;
proc sort data=all_earnstatics nodupkey;
by num buydate;
run;
data _null_;
set earnrate_count;
call symput ('number_date',_n_);
run;
sasfile all_earnstatics load;
%do date_num=1 %to &number_date;
data temp_date;
set earnrate_count;
if _n_=&date_num;
run;
data _null_;
set temp_date;
call symput ('temp_buydate',buydate);
run;
data stockhot.temp&date_num;
set all_earnstatics;
if buydate=&temp_buydate;
run;
data stockhot.temp&date_num(keep=buydate&date_num selldate&date_num earnrate&date_num);
set stockhot.temp&date_num;
rename buydate=buydate&date_num;
rename selldate=selldate&date_num;
rename earnrate=earnrate&date_num;
run;
%end;
sasfile all_earnstatics close;
data stock.buyways;
delete;
run;
%do date_num=1 %to &number_date;
%if &date_num=1 %then %do;
data buyways;
set stockhot.temp&date_num;
run;
data stock.buyways;
set buyways;
run;
%end;
%else %do;
data _null_;
call symput ('former_num',trim(left(&date_num-1)));
run;
data temp_b;
set stockhot.temp&date_num;
run;
proc sql;
create table temp_buyways as
select *
from buyways, temp_b
quit;
data buyways;
set temp_buyways;
run;
data stock.buyways;
set temp_buyways;
run;
%end;
%end;
%do date_num=1 %to &number_date;
data _null_;
call symput ('former_num',trim(left(&date_num-1)));
run;
data stock.buyways;
set stock.buyways;
if selldate&former_num>buydate&date_num then earnrate&date_num=0;
if selldate&former_num>buydate&date_num then selldate&date_num=selldate&former_num;
run;
%end;
data stock.buyways;
set stock.buyways;
earnrate_all=1;
run;
%do date_num=1 %to &number_date;
data stock.buyways;
set stock.buyways;
earnrate_all=earnrate_all+earnrate&date_num*earnrate_all;
run;
%end;
%mend repeatmake;
%repeatmake;
结合SQL和宏使用。谢谢啊!