準加法メジャー  在庫残とか(LastNonEmpty)

キューブに作成するメジャーは、通常はすべてのディメンジョンに対して、「加法」で集計されます。
私がこれまでぶつかってきた案件(DB)でもほとんどは「加法」です。

では、加法にならないメジャーを考えましょう。
例えば、平均単価とか、xx率とかはどうなのでしょう。
こういった値は通常、「積み上げて計算する値ではない」ものです。
積み上げた値を使って計算するものです。
「積み上げて計算する値ではない」値は、「計算されるメンバー」を使って定義します。

損益計算書貸借対照表の金額はどうでしょう。
売上100万 返品20万 純売上80万 経費50万 経常利益30万
などと、単純合算にはなりません。
科目と集計科目の関係については後日エントリーを上げるとして、
ここでは経理・財務系での扱い方を考えます。
経理・財務を扱ったことのある方ならわかると思いますが、
【借方】【貸方】のプラスマイナスをひっくり返して縦持ちさせるのが一般的です。
詳しくは、これも別エントリーにて。。。
ということで、結論だけ言うと
この金額も「加法」で定義して積み上げた数値の表示時に、借方・貸方を判定してプラスマイナスを調整する「計算されるメンバー」で対応できます。

                                                                                                                            • -

特殊と言えるのが【在庫残】や【受注残】といった「残データ」です。
これらは、商品とか在庫場所など普通のディメンジョンに対しては「加法」でいいのですが、年月日(時間ディメンジョン)に対してだけは「加法」を使ってはいけません。
この、特定ディメンジョンにだけ集計方法が違うというメジャーに対応する機能が【準加法メジャー】です。


【準加法メジャー】は、「時間ディメンジョン」に対してだけ特殊な集計方法を適用します。
逆にいうと「時間ディメンジョン」以外は、「加法」になってしまうんです。
Aディメンジョンは加法、Bディメンジョンは平均、Cディメンジョンは最大値
といった、柔軟な集計は定義できません。

はっきり言って、実際のビジネスケースとしては、これで十分です。
例外が出てくることもあるかもしれませんが。

【準加法メジャー】とおおげさに言っていますが、設定はメジャー項目の集計方法を選択するだけです。
集計方法で、「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と登録する必要があるんですね。

ではでは。