Create tableだけがSQLプロシジャでデータセットを作る方法ではないという話

今適当な、データセットがあったとします。

data Q1;
X=1;Y=2;output;
X=3;Y=4;output;
X=5;Y=6;output;
run;

そこで以下のSQLを実行すれば

proc sql noprint;

 create table A1 as
  select X
  from Q1
  where X<2;

 create table A2 as
  select X
  from Q1
  where X>2;

 create table A3 as
  select Y
  from Q1;

quit;

データセットA1,A2,A3が作成されます。

SQLプロシジャ内でcreate table データセット名 as 以下クエリを書けば
結果がデータセットになります。

SQLプロシジャでデータセットを作成するには上記のやり方しかないと思われている方も多いですが、そんなことはないです。
抜け道のようですが、SQLプロシジャはあくまでSASのプロシジャで、アウトプットを伴うプロシジャです。であれば、

ods listing close;
proc sql;
ods output SQL_Results=A1;
  select X
  from Q1
  where X<2;

ods output SQL_Results=A2;
  select X
  from Q1
  where X>2;

 ods output SQL_Results=A3;
  select Y
  from Q1
;
quit;

当然、ODSの対象であり、ODSの対象であれば ods outputでデータセットにできるということです。
上記のコードで同じ結果を得ることができます。

これをどう活かすかを考えます。

例えばSASのデータステップでは

data A4 A5 A6;
 set Q1;
 if X=1 then output A4;
 if X=2 then output A5;
 if X=3 then output A6;
run;

のように一回のデータステップで、複数のデータセットを作れます。
しかし、create table文では、1回で同様の操作はできません(多分、、)

ですがODSを利用すれば

proc sql;
ods output 
  SQL_Results=A4(where=(X=1))
  SQL_Results=A5(where=(X=3))
  SQL_Results=A6(where=(X=5))
;
  select X
  from Q1
;
quit;

このように実現可能です。

また、データステップでは、call symput等で、データセットを作成すると同時に
何らかの値をマクロ変数に格納する処理も同時に行えます。

ですがSQLで同様のことを1文ではできません。

がODSを利用すれば

proc sql;
ods output SQL_Results=A7;
 select X into:MX
 from Q1
 where Y=4;
quit;


のように、非常に幅の広いことができるようになります。
邪道といえば邪道かもしれませんが、せっかく、SASでSQLを使っているので
SASから利用できる部分はガンガン使っちゃっていいんじゃないでしょうか?
(DB内部やほかのシステムににSQL文を移植したりする予定がなければですが)








0 件のコメント:

コメントを投稿