概要
タイトルから何を言ってるのか、さっぱりわからないかも知れないですが、この概要を読んで頂ければ大事な問題だとわかりますので、是非ちょっと読んでみてください。
こんなテーブル構造のデータを取り扱う場合の、Framework Managerモデルの対処方法です。
何が特徴的かというと、販売実績表と販売目標表という、二つのファクト表の粒度が、実績表は日単位、目標表は月単位にデータを持っている点です。
実績を日単位、目標を月単位なんて、普通にある話ですよね。
とりあえず上のような感じで、普通にテーブル間に1対多のリレーションを張ってみます。
さて、ここで問題ですが、2015年1月のAppleの売り上げ数量(QUANTITY)と、売り上げ目標(EXPECTED_VOLUME)はいくつでしょうか?
売り上げ数量を、販売実績表で見ると、A1の2015年1月は、2015年1月1日の2個と、2015年1月2日の1個で、合計3個。
売り上げ目標は簡単で、販売目標表で見たら一発でわかる、4個。
あと1個だけ目標に届かず、という結果が正しいですね。
ところが、実際にレポートでリスト表にこれらのデータアイテムを置いてみると、こんな結果になります。
なんで、Appleの目標が8個なの?と、びっくりしてしまいます。
これは何もCognosが悪いわけではなく、こういうマルチ粒度のファクト表を取り扱うデータモデルでは、他のBIツールでもこの結果を返してしまいます。
そして、実は多くのBIツールでは、このモデルの解消法が無いという、なかなか厄介なモデルなのです。
対処方法
Cognosでは、こういうモデルの対処方法として「行列式」という機能が提供されています。
先ほどのモデルで、粒度違いのリレーションが実装されている、「日付マスタ表」に行列式を実装します。
日付マスタ表は、販売実績表とはDAY_KEYで接続し、販売目標表とはMONTH_KEYで接続しています。
行列式はFramework Managerの機能です。
日付マスタのクエリー・サブジェクト(DATEMST)の、行列式タブで、以下のように「Month」と「Day」というエントリーを作成し、DayはDAY_KEYが所属し一意にデータが存在し、MonthはMONTH_KEYが所属し一意ではなくグループ化(集約)アイテムであると宣言します。
この行列式の設定をして、発行されたモデルだと、以下のように正しい目標値の結果が出力されます。
Cognosだけでなく、全てのBIツールで気を付けないといけない大事な話なので、マルチ粒度のファクト表モデルを取り扱う場合は、結果が正しく表示されているか注意して見るように心がけてみて下さい。