対処法の一例をご紹介したいと思います。
環境や条件などの理由から、SASのマクロ機能やストアドプロシージャなどが利用できない!
というケースが意外とよくあります。
・使用するレポーティングツールでは、ストアドプロシージャが使用できない。
・SASのマクロを使える人がいないため、今後のメンテナンスを考えて使わないでください。
といったケースが、経験上ありました。
例えば、以下のようなケースが該当します。
店舗を指定して売上を出力するレポートがあります。
そのレポートには以下の抽出条件があります。
where TENPO = "店舗"
and YYYYMM = "年月"
※斜体は実行時に入力するパラメータとします。店舗の条件を削除すれば、全ての店舗情報が取得できる!と考えることができます。
実は、ここで以下の問題が起きます。
SASのマクロやストアドプロシージャを利用せず、上記の抽出を行わないようにしてください。
条件には外部からパラメータとして、任意の数字文字が与えられるとします。
また、データにはあらかじめ全店を集計したレコードは存在しないとします。
難しく書きました。
この問題はSASのマクロを利用すれば以下のように簡単にかけます。
・全店か、支店の条件かを判断するフラグ(&ZENTEN)を用意して
以下のようなプログラムを記載すれば対処できます。
where
%if(&ZENTEN = 0) %then %do;
TENPO = "店舗" and
%end;
YYYYMM = "年月"
今回の問題は、マクロを使用せずに行ってください。というものです。
ストアドプロシージャ、SASのマクロ機能が利用できれば簡単に回避できる問題も
利用できなくなるだけで意外と頭を悩ませるものです。
回答例
・全店か、支店の条件かを判断するフラグを用意して、下記のようなプログラムを記載します。
( (全店フラグ = 1 ) or
(全店フラグ = 0 and TENPO = "店舗") ) and
YYYYMM = "年月"
全店フラグが1の場合、全店を取得する場合は店舗の条件を無視したい。
逆に全店フラグが0の場合、店舗を取得する場合は店舗の条件を適応したい。
その為上記のような記載方法になっています。
・全店フラグに1を入れて実行した場合、実行される場合の条件式は以下のようになります。
( (1 = 1 ) or
(1 = 0 and TENPO = "店舗") )
つまり
( (真 ) or 真の条件のみなので、こちらは適応されます。
(偽 and TENPO = "店舗") ) 偽かつ店舗条件なので、こちらは適応されません。
その為、店舗の条件を無視することができました。
・全店フラグに0を入れて実行した場合、実行される場合の条件式は以下のようになります。
( (0 = 1 ) or
(0 = 0 and TENPO = "店舗") )
つまり
( (偽 ) or 偽の条件のみなので、こちらは適応されません。
(真 and TENPO = "店舗") ) 真かつ店舗条件なので、こちらは適応されます。
その為、店舗の条件を適応することができました。
上記の書き方をすれば、SASのマクロや、ストアドプロシージャを利用しなくても、
IF文のように利用することができます。
どうしても困ったときの対処方法としていかがでしょうか。
0 件のコメント:
コメントを投稿