You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在输出表为空时自动执行上月日期的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 20:05:29