準加法メジャー 在庫残とか(LastNonEmpty)
キューブに作成するメジャーは、通常はすべてのディメンジョンに対して、「加法」で集計されます。
私がこれまでぶつかってきた案件(DB)でもほとんどは「加法」です。
では、加法にならないメジャーを考えましょう。
例えば、平均単価とか、xx率とかはどうなのでしょう。
こういった値は通常、「積み上げて計算する値ではない」ものです。
積み上げた値を使って計算するものです。
「積み上げて計算する値ではない」値は、「計算されるメンバー」を使って定義します。
損益計算書や貸借対照表の金額はどうでしょう。
売上100万 返品20万 純売上80万 経費50万 経常利益30万
などと、単純合算にはなりません。
科目と集計科目の関係については後日エントリーを上げるとして、
ここでは経理・財務系での扱い方を考えます。
経理・財務を扱ったことのある方ならわかると思いますが、
【借方】【貸方】のプラスマイナスをひっくり返して縦持ちさせるのが一般的です。
詳しくは、これも別エントリーにて。。。
ということで、結論だけ言うと
この金額も「加法」で定義して積み上げた数値の表示時に、借方・貸方を判定してプラスマイナスを調整する「計算されるメンバー」で対応できます。
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
特殊と言えるのが【在庫残】や【受注残】といった「残データ」です。
これらは、商品とか在庫場所など普通のディメンジョンに対しては「加法」でいいのですが、年月日(時間ディメンジョン)に対してだけは「加法」を使ってはいけません。
この、特定ディメンジョンにだけ集計方法が違うというメジャーに対応する機能が【準加法メジャー】です。
はっきり言って、実際のビジネスケースとしては、これで十分です。
例外が出てくることもあるかもしれませんが。
【準加法メジャー】とおおげさに言っていますが、設定はメジャー項目の集計方法を選択するだけです。
集計方法で、「First Child」「FirstNonEmpty」「Last Child」「LastNonEmpty」そして「ByAccount」を選択すると、準加法となります。
【参照】
http://technet.microsoft.com/ja-jp/library/ms175356(SQL.90).aspx
特に「残」で使うのが
- LastChild
- LastNonEmpty
です。この2つでは扱いに注意が必要です。・・・やっと今日の本題
・・・ByAccountは別の機会に・・・
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
LastChildは、時間ディメンジョンの最後の「子」の値が採用されます。
つまり2012年の値は2012年12月の値が採用されます。
値がなくてもです。
2012年の在庫残が、1月、2月・・・と登録され11月まで登録されていても、「2012年12月」はデータがないので、2012年の残は「なし」となります。
これでは困るので、値がある月までの数字をとるのがLastNonEmptyです。
これは、値がなければ子を遡っていって、見つかった値をとります。
前記例では、2012年12月は値がないので11月分が2012年残となります。
ところが・・・
LastNonEmptyも、別のディメンジョンをドリルダウンすると問題が生じます。
A商品は、10月残5個 11月残 なし
B商品は、10月残3個 11月残 4個
とすると、全体の11月残は 「4個」になります。
しかし、
A商品の残は、(11月データがないので、10月が選択され)5個
B商品の残は、4個
と、合計と明細が合わなくなります。
これを回避するには、A商品の11月残をなし(NULL)ではなく、11月残0個
としなければなりません。
(12月もなければ、11月残0個が選択されればいいので、12月残なしで構いません)
残データは、時点データなのでデータ量が膨らみがちです。
このためDBでは、「データなし」のレコードは登録しないケースが多いのですが、レコードがない(なし)はこのような弊害があるため、0になった時だけでも明確に0と登録する必要があるんですね。
ではでは。