2014年9月18日木曜日

変数値をマクロ変数に格納する方法「SQL編」



前回の続きで、今度はSQLプロシジャを使った方法を紹介。
(最後に注意点の記事リンクも貼ったので、そちらも要参照)


* サンプルデータ ;
data DT1;
input A$ B$ @@;
cards;
001 AA 002 BB 003 CC
run;

 
B
 001
 AA
 002
 BB 
 003
 CC 


上記変数A,Bの値をマクロ変数に格納します。

変数値をマクロ変数に格納 ;
proc sql noprint;
   select A, B  into :A1-, :B1- 
   from DT1;
quit;

%let OBS = &SQLOBS;

* ログにマクロ変数値を展開 ;
%macro MAC;
   %do i=1 %to &OBS;
       %put  &&A&i  &&B&i;
   %end;
%mend;
%MAC;

ログ
001  AA
002  BB
003  CC


SQLのINTOを使った方法(「こちら」を参照)

ただし「into :A1-, :B1-」という書き方はSAS9.3より前のバージョンでは使えないので
データステップ100万回「SQLでマクロ変数に値を格納する into: separated by」で紹介されている「into :A1-:A9999, :B1-:B9999」と値を大きくとっておくテクニックが使えます。

そしてもうひとつ重要な役割をするのが自動マクロ変数SQLOBS。
直前のSQLプロシジャが処理した行数が自動で入ってきます。(詳細は「こちら」を参照)
これを%DOループで利用してます。



一般的に使われるのはCALL SYMPUTXですが、SQLのINTOと&SQLOBSのコンボ技の方がスッキリとした文になるので個人的に好きな方法ではあります。


📝以下、落とし穴についての記事も要確認!

・数値をマクロ変数に格納すると丸められる可能性がある
・フォーマットが割り当てられた変数だと、フォーマットを当てた値がマクロ変数に格納される。

SQLプロシジャのINTO句で、前方に余計な半角スペースが入る場合がある。
・余計な半角スペースが入ってしまう場合の小技を紹介してます


0 件のコメント:

コメントを投稿