1

我希望这个问题是有道理的。我在 SAS 中使用 SQL 来查询 Oracle 数据库。我也使用 SQL Developer。我有一个我知道有效的 SQL 查询,但是当我尝试修改它以在 SAS(T/SQL) 中工作时,结果不一样。

我正在尝试返回结束日期在 2012 年 3 月之内的活动的客户。谁能告诉我我做错了什么?

工作查询:

select distinct customer_key
from edw.customer_product_fact
where time_key = '31-jan-12'
and campaign_active = 'Y'
and campaign_cd is not null 
and last_day(campaign_end_date) = add_months(time_key,2)

SAS查询:

select distinct customer_key
from edw.customer_product_fact
where time_key = '31-jan-12'd
and campaign_active = 'Y'
and campaign_cd is not null
and intnx('month',campaign_end_date, 0, 'end') =intnx('month', time_key, 2, 'end');

我尝试使用dateaddintnx但 SAS 不支持它。

4

2 回答 2

3

我假设显示为WORKING QUERY的代码示例是您可以在 Oracle 工具中运行的东西,而SAS QUERY是您使用的东西PROC SQL(其中 EDW 指的是先前分配的LIBNAME语句)。在 SAS 世界中,后一个示例使用“隐式传递”,这意味着您的 SAS 代码被尽可能地转换为 Oracle 代码。这就是为什么dateadd(Oracle 函数)在 SAS 中不起作用的原因。

如果您习惯编写本机 Oracle SQL,您可能会发现使用PROC SQL. 一个优点是您可以在查询中使用 SAS 宏变量;当 Oracle 处理它们时,它们将被“扩展”。

换句话说,要创建一个名为RESULTS的包含查询结果的 SAS 数据集,请尝试以下操作:

%let MY_PARM = '31-jan-12';
proc sql;
   connect to oracle (user="userid" password="password");
   create table RESULTS as
   select * from connection to oracle (

      select distinct customer_key
      from edw.customer_product_fact
      where time_key = &MY_PARM
        and campaign_active = 'Y'
        and campaign_cd is not null 
        and last_day(campaign_end_date) = add_months(time_key,2)

    );
quit;

括号之间的所有内容都按照书面形式直接提交给 Oracle,这意味着您可以利用任何特定于 Oracle 的语法。我正在展示如何使用 SAS 宏变量 (&MY_PARM) 来说明该功能;你可能不需要它。

于 2012-12-20T16:13:36.560 回答
0

如果我没记错的话,存储在 Oracle 中的日期应该始终在 SAS 中作为日期时间来处理。尝试将日期更改为日期时间格式或使用 datepart 函数从日期时间字段中提取日期部分。

select distinct customer_key
from edw.customer_product_fact
where datepart(time_key) = '31jan12'd
and campaign_active = 'Y'
and campaign_cd is not null
and intnx('month',datepart(campaign_end_date), 0, 'end') =intnx('month', datepart(time_key), 2, 'end');
于 2012-12-21T07:48:54.753 回答