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 件のコメント:
コメントを投稿