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;
编辑:您可能需要考虑如果 运行 在星期一会发生什么,并检查您的日期是否符合预期。
我正在尝试总结过去 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;
编辑:您可能需要考虑如果 运行 在星期一会发生什么,并检查您的日期是否符合预期。