SQLでマクロ変数に値を格納する into: separated by

SQLでマクロ変数に値を格納する方法についてご質問いただきましたので、あまり詳しくなくて自信がないですが紹介します。

SELECT INTO:を利用します。

proc sql noprint;
select count(*) into:obs
from DS;
quit;

などでデータセットのオブザベーション数をobsというマクロ変数に格納できます。

他に例えば

data Q1;
X='い';Y='A';Z=1;output;
X='ろ';Y='B';Z=2;output;
X='は';Y='C';Z=3;output;
run;







のようなデータセットがあった場合


proc sql noprint;
 select X,Y,Z
 into  :MX1-:MX3
      ,:MY1-:MY3
      ,:MZ1-:MZ3
 from Q1
 ;
quit;

のようにかけば、マクロ変数MX1にXの一つ目の値、MX2に二つ目の値、以下、同Y同Zに同じように格納できます。

%put &MX1
     &MX2
     &MX3
     &MY1
     &MY2
     &MY3
     &MZ1
     &MZ2
     &MZ3
;

するとログにでるのは




です。


データセットのオブザベーション数が可変だけども、どれくらいになるかある程度わかっていれば

proc sql noprint;
 select X,Y,Z
 into  :MX1-:MX999
      ,:MY1-:MY999
      ,:MZ1-:MZ999
 from Q1
 ;
quit;

と大雑把な方法ですが、大きくとっておけば、オブザベーションがない場合も
よけいなマクロ変数は作成されないので、使えます。


あと、以下のように書くと

proc sql noprint;
 select X,Y,Z
 into  :MXALL separated by '、'
      ,:MYALL separated by '、'
      ,:MZALL separated by '、'
 from Q1
 ;
quit;


%put &MXALL
     &MYALL
     &MZALL
;

ログは





のように、データをseparated by で指定した区切り文字で連結したものを一つのマクロ変数に
格納できるので、マクロのパラメータや関数の引数に渡したい値を作る時などに重宝します。

他にselect into:について技をお持ちの方がいらっしゃれば、むしろ勉強させていただきたいです。
call symputはデータステップの中でやるので、可変的にマクロ変数を作るうえで凄いやりやすい
のですが、SQLでもできないでしょうか、、。

多分、色々できると思うのですが、、いっつも、とりあえずわかる方法でやってしまって、なかなか新手開拓ができてないです。









0 件のコメント:

コメントを投稿