【问题标题】:SAS PROC SQL where between 4 mondays ago and last mondaySAS PROC SQL 在 4 星期一前和上星期一之间
【发布时间】:2021-10-11 16:59:56
【问题描述】:

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

作为参考,今天是 8 月 6 日,所以我想开始收集他们的每周销售额并预测 7 月 5 日,直到前一周的 7 月 26 日星期一。我最终计划使用 do until last 将这个 4wk 预测总结为一行。按商店和 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,如果销售

但是,我无法让 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-server date sas between proc-sql


【解决方案1】:

使用宏变量,因为代码使用显式传递,并且 DB 期望符合数据库的日期文字。 您的所有 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;

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

【讨论】:

  • 谢谢!我真的需要更多地利用 call symputx 函数。我也把它改成了date9。因为这就是 mon_dt 的存储方式。最后:周一运行没有问题,它会回到正确的周一。编辑:我有格式 yymmdd10 的原因是我可以确保它是正确的星期一。我没有提到这一点是我的错,但最终一切都解决了
猜你喜欢
  • 2012-04-24
  • 1970-01-01
  • 2012-01-28
  • 1970-01-01
  • 1970-01-01
  • 2013-05-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多