月次予算と日次実績を1つのテーブルで管理する!統合ファクトモデリング

月次予算と日次実績を1つのテーブルで管理する!統合ファクトモデリング

2025.11.19

この記事は「現場で使えるPower BI 4つのモデリングパターン - 予実管理編」の連載記事です。今回は「統合ファクト」パターンを紹介します。

前回は、ブリッジテーブルを使って実績と予算を紐づけるという方法を紹介しましたが、今回はブリッジテーブルも使わず、実績と予算を1つのテーブルに統合します。データ加工は最もシンプルですが、メジャー作成に工夫が必要なパターンです。

こんな方におすすめ

  • データ加工をできるだけシンプルにしたい方
  • 予算と実績を一元管理したい方
  • DAX関数の記述に慣れている方

この記事で学べること

  • 粒度の異なるデータを1つのテーブルに統合する手法
  • 指標種別による実績・予算の区別方法
  • 統合ファクトテーブルでのメジャー作成テクニック

今回加工したデータのイメージは下記のとおりです。

統合ファクト

日付 地域ID カテゴリID 指標種別 金額 製品ID 店舗ID 顧客ID 出荷モードID
2024/01/01 R001 CAT001 予算 32,258 null null null null
2024/01/01 R001 CAT001 実績 25,000 P001 S001 C001 SM001

このイメージでデータを作ることができれば、グラフにするのは比較的簡単です。問題は、メジャーの作成で指標種別によるフィルタリングが必要になることです。

このパターンの設計思想

なぜ統合ファクトなのか?

今回のパターンでは、予算と実績を別々のテーブルで管理せず、1つのテーブルに統合します。これにより、以下のメリットがあります:

  • データ加工が最もシンプル:ブリッジテーブルやキーの付与が不要
  • リレーション設計が単純:N対Nの問題が発生しない
  • 一元管理が可能:予算と実績が同じテーブルにある

一方で、デメリットもあります:

  • メジャー作成が複雑:常に指標種別でフィルタする必要がある
  • 直感的でない:粒度の異なるデータが混在する
  • null値の扱い:予算行には詳細項目がnullになる

データ加工手順(Power Query)

データの加工はPower BIのデータ変換ツールであるPower Queryで行います。全ての工程をステップバイステップで説明しようとすると大変長くなってしまい、1記事では収まらないボリュームになってしまうため、ポイントに絞った説明になる点はご了承ください。

ステップ1:実績明細を日次に集計しておく

実績明細に地域IDとカテゴリIDの情報を付与して日次で集計しておきます。この段階で、予算データと共通する項目(日付、地域ID、カテゴリID)を揃えておくことがポイントです。

ステップ2:予算データの日付を確認

予算を取り込み、年月のカラムを確認します。日付型になっていれば、そのままでOKです。年月単位なので日の情報がないのですが、自動的に月初日が入っていると思います。もし日付型でない場合は、日付型に変換しておきましょう。

ステップ3:実績と予算を統合する

予実両方にあるカラムを紐づけて、UNIONで実績と予算をくっつけます。Power Queryでは「クエリの追加」でできます。(クエリのマージではなく、クエリの追加)

予算側には顧客IDや製品IDはないので、nullのままです。

2025-10-powebi-4-1

ポイント:

  • 実績データには「指標種別」列に「実績」を設定
  • 予算データには「指標種別」列に「予算」を設定
  • 予算データの詳細項目(製品ID、店舗ID、顧客ID、出荷モードID)はnull

これで統合ファクトは完成です。なんとこれだけ!

モデリング設定(Power BI Desktop)

ここからはPower BI Desktopです。

カレンダーテーブルの作成

日別のカレンダーテーブルをDAX関数で自動生成します。

カレンダーテーブルが必要な理由:

  1. 年度集計が簡単:4月始まりの会計年度にも対応
  2. 時間インテリジェンス関数が使える:前年同月、累計などの計算が容易
  3. 期間フィルタが柔軟:四半期、半期などの集計も可能
  4. 統合ファクトの橋渡し:日次実績と月次予算を統一的に扱える

リレーション設定

カレンダーテーブルと各種マスタをリレーションさせています。

2025-10-powebi-4-2

ポイント:
統合ファクトテーブルは1つなので、リレーション設計は非常にシンプルです。カレンダーテーブルの日付列と統合ファクトの日付列を紐づけ、各マスタも同様に紐づけます。

メジャーの作成(前年同月実績や予算差等)

今までのモデリングと違い、売上実績や売上予算でも関数で計算する必要があります。実績の場合は指標種別で実績だけにフィルタして合計します。

// 実績合計
// 統合ファクトから指標種別が「実績」のみを抽出して合計
売上実績 = 
CALCULATE(
    SUM('統合ファクト'[金額]),
    '統合ファクト'[指標種別] = "実績"
)

// 予算合計
// 統合ファクトから指標種別が「予算」のみを抽出して合計
売上予算 = 
CALCULATE(
    SUM('統合ファクト'[金額]),
    '統合ファクト'[指標種別] = "予算"
)

// 予算との差額を計算
// プラスなら予算超過、マイナスなら予算未達
予算差 = 
[売上実績] - [売上予算]

// 予算達成率を計算(0除算を回避)
// DIVIDE関数は分母が0の場合にBLANKを返す
予算比 = 
DIVIDE(
    [売上実績],
    [売上予算],
    BLANK()
)

// 前年同月の実績を取得
// DATEADD関数で1年前の同じ期間の実績を計算
前年同月実績 = 
CALCULATE(
    [売上実績],
    DATEADD('日カレンダーテーブル'[Date], -1, YEAR)
)

// 年度累計を計算(4月始まり)
// 選択された年度の開始から現在までの累計を計算
年度累計実績 = 
VAR CurrentFiscalYear = SELECTEDVALUE('日カレンダーテーブル'[年度])
VAR MaxDate = MAX('日カレンダーテーブル'[Date])
RETURN
CALCULATE(
    [売上実績],
    FILTER(
        ALL('日カレンダーテーブル'),
        '日カレンダーテーブル'[年度] = CurrentFiscalYear &&
        '日カレンダーテーブル'[Date] <= MaxDate
    )
)

重要な注意点:

統合ファクトパターンでは、すべてのメジャーで指標種別によるフィルタリングが必要です。単純なSUM関数だけでは予算と実績が混在してしまうため、必ずCALCULATE関数を使って指標種別を指定してください。

可視化する

カード、棒グラフ、テーブルを使って可視化します。データも式もできているので、ドラッグして見た目の調整をしたただけです。

2025-10-powebi-4-3

まとめ

このモデリングパターンの特徴

メリット

  • データ加工が最もシンプル(クエリの追加だけ)
  • リレーション設計が単純(N対Nの問題なし)
  • ブリッジテーブルが不要
  • 予算と実績を一元管理できる

デメリット・注意点

  • すべてのメジャーで指標種別のフィルタが必要
  • DAX関数の記述が複雑になる
  • 粒度の異なるデータが混在し、直感的でない
  • null値の扱いに注意が必要
  • メジャーの保守性がやや低い

実装のポイント

データ加工は一番楽だったものの、前年実績や予算差等を求めるDAX関数が他のモデリングより手がかかりました。計算式の中で必ずフィルタ条件を書かねばならず、ちょっと面倒だなと感じます。

また、データを眺めていても、混合粒度の複雑性がそのまま1つのテーブルにあるのは理解しにくいと思いました。直感的に集計できません。

運用面での推奨事項

データ加工フェーズでは楽なのですが、可視化フェーズでの関数の複雑さを考えると、あまりおすすめできないパターンだと思いました。

特に以下のような場合は、他のパターンを検討することをおすすめします:

  • DAX関数に不慣れなメンバーが保守する場合
  • メジャーの数が多くなることが予想される場合
  • データの意味を直感的に理解したい場合

ただし、以下のような場合には有効です:

  • データ加工の工数を最小限にしたい場合
  • DAX関数の記述に十分慣れている場合
  • シンプルなリレーション設計を優先したい場合

次回予告

次回は連載の最終回として、4つのモデリングパターンを振り返り、それぞれの使い分けについて解説します。

連載記事一覧

  1. 現場で使えるPower BI 4つのモデリングパターン - 予実管理編
  2. Power BI初心者が絶対知っておくべき重要用語を解説
  3. 月次予算+月次実績
  4. 日割り予算+月次実績
  5. 月次予算+実績明細
  6. 統合ファクト(本記事)
  7. 振り返り(次回)

この記事をシェアする

FacebookHatena blogX

関連記事