簡體   English   中英

帶有do循環的SAS宏

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM