2015年5月17日日曜日

WHEREステートメントの落とし穴


「WHEREステートメント」 と 「WHERE=データセットオプション」 を組み合わせると、想定外のデータになってしまうかもしれないです。


*** サンプルデータ作成 *************;
data DT1;
   A=1; B="aa"; output;
   A=2; B="bb"; output;
run;

 A 
   1 
 aa  
   2  
 bb  

data DT2;
   A=1; output;
   A=2; output;
run;

 A 
  1 
  2  

*** 注意が必要な例 **********;
data OUT1;
  merge DT1 (where=(B="aa"))
          DT2
  ;
  by A;
  where A=2;
run;

 A 
   1 
 aa  
   2  
   

結果のデータセットは想定通りだったでしょうか?
↓こんな感じになると思った方もいると思います。
 A 
   2  
       

これは、「WHERE=データセットオプション」が指定されたデータセットは、そのWHERE条件だけが適用され、
それ以外のデータセットは、「WHEREステートメント」の条件が適用されています。

つまり、今回の例で、、

merge DT1 (where=(B="aa"))
          DT2
;
where A=2;

DT1は「where=(B="aa")」の条件が適用され、
DT2は「where A=2」の条件が適用されて、マージされます。


ちなみに、SAS9.3からログに以下のようなWARNINGが出るようになっていますが、SAS9.2ではWARNINGが出ないので、この問題に気づきにくいです。

WARNING: WHEREステートメントは最後のSET/MERGE/UPDATE/MODIFYステートメントのデータセットに適用できません。
データセットがオープンエラー、または既にWHEREデータセットオプションを指定しています。




0 件のコメント:

コメントを投稿