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;
  by A;
  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 件のコメント:

コメントを投稿