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');

dateaddの代わりに使用してみましintnxたが、SAS ではサポートされていません。

4

2 に答える 2

3

WORKING QUERYとして示されているコード サンプルは Oracle ツールで実行できるものであり、SAS QUERYは使用して実行するものであると想定していますPROC SQL(EDW は以前に割り当てられたLIBNAMEステートメントを指します)。SAS の世界では、この後者のサンプルは「暗黙的なパススルー」を使用しています。これは、SAS コードが可能な限り Oracle コードに変換されることを意味します。そのため、dateadd(Oracle 関数) は SAS では機能しません。

ネイティブの Oracle SQL の記述に慣れている場合は、PROC SQL. 1 つの利点は、クエリ内で 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 では常に datetime として扱われるべきです。日付を日時形式に変更するか、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 に答える