SAS有条件地执行PROC SQL

时间:2018-06-25 16:54:16

标签: sas conditional execution

我正在构建代码,以导入最近30天的每日销售文件,然后替换主表中最近30天的记录。如果导入的每日文件有足够的记录,我只想替换最近30天:

proc sql;
select min(sale_date) into :oldestSale from daily_sales;
quit;

这是我要在SAS中构建的逻辑:

  

如果最旧的销售<(today()-30)然后       替换PROC SQL   其他       没做什么   结束

什么是最佳解决方案?这在我翻译的Python中是微不足道的,但是我在进行类似操作时仍受制于SAS语法...

1 个答案:

答案 0 :(得分:2)

“逻辑”在细节上相当模糊,但要点似乎是

  • 导入每日销售额
  • 假定每日销售已完成,并且代表了每天的销售
  • 如果每日销售信息的开始日期已超过30天
    • 从开始日期起删除主表中的所有销售额
    • 追加当前的每日销售额

一种方法是拥有一个宏,该宏将有条件的删除/追加操作作为“替换”操作。

%macro process_daily_sales;
  proc import … out=daily_sales;
  run;

  %local oldestSale;
  %let oldestSale = %sysfunc(today()); %* sentinel value just in case;

  proc sql;
    select min(sale_date) into :oldestSale from daily_sales;
  quit;

  %local gap;
  %let gap = %eval ( %sysfunc(today()) - &oldestSale );

  %if &gap > 30 %then %do;
    proc sql;
      delete from main_sales where sales_date >= &oldestSale;
    quit;
    proc append base=main_sales data=daily_sales;
    run;
  %end;
%mend;