2017年3月10日金曜日

データの抽出条件をIF文のように利用する方法

今回は主にレポーティングツールを利用する際に直面する問題について
対処法の一例をご紹介したいと思います。


抽出条件を変えるだけで複数のプログラム、レポートをまとめる事ができるが、
環境や条件などの理由から、SASのマクロ機能やストアドプロシージャなどが利用できない!
というケースが意外とよくあります。

・使用するレポーティングツールでは、ストアドプロシージャが使用できない。
・SASのマクロを使える人がいないため、今後のメンテナンスを考えて使わないでください。

といったケースが、経験上ありました。



例えば、以下のようなケースが該当します。

店舗を指定して売上を出力するレポートがあります。
そのレポートには以下の抽出条件があります。

    where TENPO = "店舗"
        and YYYYMM = "年月"
※斜体は実行時に入力するパラメータとします。

店舗の条件を削除すれば、全ての店舗情報が取得できる!と考えることができます。
実は、ここで以下の問題が起きます。

  SASのマクロやストアドプロシージャを利用せず、上記の抽出を行わないようにしてください。
  条件には外部からパラメータとして、任意の数字文字が与えられるとします。
  また、データにはあらかじめ全店を集計したレコードは存在しないとします。

難しく書きました。
この問題はSASのマクロを利用すれば以下のように簡単にかけます。

  ・全店か、支店の条件かを判断するフラグ(&ZENTEN)を用意して
    以下のようなプログラムを記載すれば対処できます。

  where
    %if(&ZENTEN = 0) %then %do;
      TENPO = "店舗" and
    %end;
  YYYYMM = "年月"


今回の問題は、マクロを使用せずに行ってください。というものです。
ストアドプロシージャ、SASのマクロ機能が利用できれば簡単に回避できる問題も
利用できなくなるだけで意外と頭を悩ませるものです。


回答例
  ・全店か、支店の条件かを判断するフラグを用意して、下記のようなプログラムを記載します。

where
  ( (全店フラグ = 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 件のコメント:

コメントを投稿

ネイチャーインサイト サイトリニューアル&NIBLOGの引っ越し

ご連絡が遅くなりましたが、 ネイチャーインサイトの際とがリニューアルしました。 https://www.n-insight.co.jp/ それに伴い、NIBLOGも引っ越しすることになりました。 https://www.n-insight.co.jp/niblog/ ...