如何在输出表为空时自动执行上月日期的SAS PROC SQL查询
实现方案:自动回退查询上月数据的SAS代码实现
核心逻辑
先执行指定日期的查询,判断结果表是否为空;若为空则自动计算上月月末日期,重新执行查询。以下提供两种常用实现方式:
方式一:使用SAS宏(推荐,灵活性高)
宏可以封装逻辑,方便复用和扩展:
%macro get_kundedata(target_date='31Aug2022'd); /* 1. 执行初始日期查询 */ PROC SQL; CREATE TABLE WORK.QUERY_FOR_A_KUNDESCORINGRATINGRE AS SELECT t1.PD, t1.DATO, t1.KSRUID FROM DLKAR.A_KUNDESCORINGRATINGRETRO t1 WHERE t1.KSRUID = 6 AND t1.DATO = &target_date.; QUIT; /* 2. 查询结果表的观测数,判断是否为空 */ %let obs_count = 0; PROC SQL noprint; SELECT nobs INTO :obs_count FROM dictionary.tables WHERE libname='WORK' AND memname='QUERY_FOR_A_KUNDESCORINGRATINGRE'; QUIT; /* 3. 若为空,自动查询上月月末数据 */ %if &obs_count. = 0 %then %do; /* 计算上月最后一天:INTNX函数取上月月末 */ %let prev_month_end = %sysfunc(intnx(month, &target_date., -1, e), date9.); %let prev_month_end_d = "&prev_month_end."d; PROC SQL; CREATE TABLE WORK.QUERY_FOR_A_KUNDESCORINGRATINGRE AS SELECT t1.PD, t1.DATO, t1.KSRUID FROM DLKAR.A_KUNDESCORINGRATINGRETRO t1 WHERE t1.KSRUID = 6 AND t1.DATO = &prev_month_end_d.; QUIT; %put 提示:指定日期&target_date.无数据,已自动查询上月月末&prev_month_end_d.的数据; %end; %mend; /* 调用宏,传入目标日期 */ %get_kundedata(target_date='31Aug2022'd);
细节说明
- 空表判断:通过
dictionary.tables系统表获取WORK库中目标表的nobs(观测数),若为0则判定为空;也可以用%sysfunc(attrn(%sysfunc(open(WORK.QUERY_FOR_A_KUNDESCORINGRATINGRE)), nobs))直接读取观测数,两种方式等价。 - 上月日期计算:
INTNX(month, &target_date., -1, e)的含义是:以目标日期为基准往前推1个月,取该月最后一天(e代表end),再转成SAS支持的日期常量格式。 - 扩展支持:如果需要多次回退(如上月也空则再往前推),可以在
%if块中添加循环或递归调用宏。
方式二:DATA步+CALL EXECUTE(无需宏)
如果不想使用宏,可通过DATA步动态生成重查代码:
/* 1. 初始查询 */ PROC SQL; CREATE TABLE WORK.QUERY_FOR_A_KUNDESCORINGRATINGRE AS SELECT t1.PD, t1.DATO, t1.KSRUID FROM DLKAR.A_KUNDESCORINGRATINGRETRO t1 WHERE t1.KSRUID = 6 AND t1.DATO = '31Aug2022'd; QUIT; /* 2. 判断空表并生成重查代码 */ DATA _null_; set sashelp.vtable end=eof; where libname='WORK' and memname='QUERY_FOR_A_KUNDESCORINGRATINGRE'; if nobs = 0 then do; prev_month_end = intnx('month', '31Aug2022'd, -1, 'e'); call execute(cats( 'PROC SQL; CREATE TABLE WORK.QUERY_FOR_A_KUNDESCORINGRATINGRE AS SELECT PD, DATO, KSRUID FROM DLKAR.A_KUNDESCORINGRATINGRETRO WHERE KSRUID=6 AND DATO="', put(prev_month_end, date9.), '"d; QUIT;' )); put "提示:指定日期无数据,已自动查询上月月末数据"; end; run;
内容的提问来源于stack exchange,提问作者Christoffer
相关产品推荐
相关产品推荐

