[英]SAS Macro with a do loop
我正在嘗試編寫一個查詢,其中創建一個新表,其中包含來自許多現有數據集的變量選擇,所有數據集都以YYYYMM結尾(例如dataset_201610)。 然后我試圖將此數據附加到主數據庫。 當我運行它時,它不會循環回到其他數據集。 有幫助嗎?
%macro create_master_data_table;
*If the master table exists then delete it;
%if %sysfunc(exist(data_master)) %then %do;
proc sql;
drop table data_master;
quit;
%end;
%let yyyymm = 201702;
%do %while (&yyyymm >= 201610);
*Create a simple table with a month id and the fields we want;
data thismonth;
set Base.Accounts_&yyyymm;
keep var1 var2 var3
run;
*Append the fields we want to the master table;
proc append base=data_master
data=Base.Accounts_&yyyymm(keep=var1 var2 var3);
run;
%end;
%mend create_master_data_table;
%create_master_cre_table;
你需要增加或減少你的&yyyymm
宏變量,否則它將永遠循環。 此外,如果增加,程序的設置方式將永遠循環,因此您需要從最大日期開始遞減。
因為您正在處理月/日並且總是附加數據集,所以您需要使用一些額外的檢查來確保沒有錯誤並及時執行。
修改你的程序:
%macro create_master_data_table(mindate=, maxdate=);
*If the master table exists then delete it;
%if %sysfunc(exist(data_master)) %then %do;
proc sql;
drop table data_master;
quit;
%end;
/* Initialize variables */
%let i = 0;
%let startdate = %sysfunc(inputn(&maxdate., yymmn6.) );
%let nextdate = %sysfunc(intnx(month, &startdate., &i.) );
%do %while (&nextdate > %sysfunc(inputn(&mindate., yymmn6.) ) );
/* Decrease date by 1 month relative to start date */
%let nextdate = %sysfunc(intnx(month, &startdate., &i.) );
/* Convert from SAS date to yyyymm */
%let yyyymm = %sysfunc(putn(&nextdate, yymmn6.) );
/* Only pull data if the table exists */
%if(%sysfunc(exist(Base.Accounts_&yyyymm.) ) ) %then %do;
*Create a simple table with a month id and the fields we want;
data thismonth;
set Base.Accounts_&yyyymm;
keep var1 var2 var3
run;
*Append the fields we want to the master table;
proc append base=data_master
data=Base.Accounts_&yyyymm(keep=var1 var2 var3);
run;
%end;
%else %put WARNING: Missing data: &yyyymm.;
%let i = %eval(&i. - 1);
%end;
%mend create_master_data_table;
%create_master_data_table(mindate=201610, maxdate=201702);
如果您願意,可以將它們設置為默認的最小值/最大值。 另請注意,我們假設輸入日期將采用yyyymm
格式; 如果不更改程序,它將無法與其他日期格式一起使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.