SAS PROC SQL 在 4 个星期一前和上星期一之间

SAS PROC SQL where between 4 mondays ago and last monday

我正在尝试总结过去 4 周的预测与销售 数据,每周从星期一开始。

作为参考,今天是 8 月 6 日,所以我想开始收集他们的每周销售额并预测 7 月 5 日会上升到上一周的星期一,7 月 26 日。我最终计划使用 do until last 将这个 4wk 预测汇总到一行中。按 Store 和 SKU 分组的报表,我可以在其中使用 put 语句创建一个新列来表示他们的销量是否超过他们的预测。 例如,假设他们有以下数据

|Mon_DT            |STORE |SKU  |wk_FCST|wk_Sales|
|05July21:00:00:00 | 5    | abc | 10    | 12     |
|12July21:00:00:00 | 5    | abc | 10    | 16     |
|19July21:00:00:00 | 5    | abc | 10    |  7     |
|26July21:00:00:00 | 5    | abc | 10    | 12     |

一直到最后。预测将读为 40,销售额为 47,如果销售额 < 预测则 LOWforecast = 'Y';

但是,我无法让 between 语句工作以仅提取最后 4 周(从星期一开始)。

DATA Getweeks; 
StartOversell = intnx('week.2',today(),-4);
endoversell = intnx('week.2',today(),-1);
format StartOversell yymmdd10.;
format endoversell yymmdd10.;
Run;
Proc sql;  
    connect to odbc (dsn='****' uid='****' pwd='***'); 
        create table work.Forecast1 as select distinct * from connection to odbc 
        (select MON_DT as DATE, Store_Number as Store, PROD_PKG_ID as SKU, FCST AS WK_FCST, SALES AS WK_sales, DIFF_QTY
            From FCST
                 where Mon_DT >= 'StartOversell'd and Mon_DT <= 'endoversell'd );
    disconnect from odbc;
quit;

我也尝试过使用宏变量,但没有成功。

使用宏变量,因为代码使用显式传递并且数据库需要符合数据库的日期文字。 您的所有 SQL 都必须在显式传递中符合 DB - 而不是 SAS SQL。

如果您使用 MS SQL 并且它需要日期作为文字的“MM/DD/YY”。所以我将使用 mmddyyS10. 格式来创建一个看起来像这样的宏变量。您可以使用 put() 函数转换值。

在这种情况下,在宏变量中包含引号也是一个好主意,因为 Oracle 需要单引号,而不是双引号 - 不确定 MS SQL。 quote() 函数可用于毫无问题地添加引号。


    DATA Getweeks; 
    StartOversell = intnx('week.2',today(),-4);
    call symputx('startOversell', quote(put(startOverSell, MMDDYYS10.), "'"));
    ...
    Run;
    
    %put &startOversell;

Proc sql;  
    connect to odbc (dsn='****' uid='****' pwd='***'); 
        create table work.Forecast1 as select distinct * from connection to odbc 
        (select MON_DT as DATE, Store_Number as Store, PROD_PKG_ID as SKU, FCST AS WK_FCST, SALES AS WK_sales, DIFF_QTY
            From FCST
                 where Mon_DT >= &startOverSell and Mon_DT <= &endOverSell );
    disconnect from odbc;
quit;

编辑:您可能需要考虑如果 运行 在星期一会发生什么,并检查您的日期是否符合预期。