この記事はMicrosoft Power BI Advent Calendar 2025 12月14日担当分の記事です。
はじめに
間違ったデータモデリングにしてしまうとレポートの品質・パフォーマンスを大きく左右したり、誤った分析をしてしまう可能性があります。データモデリングが原因で値が正しく計算されない例を紹介したいと思います。
対象のレポート
海外サイト Workout Wednesday の Power BI Challenge「Create Dynamic Annotations」のレポートを確認したところ、データモデリングに問題で予期しない数値が表示されていました。今回はその例を参考にしていきます。
上記URLからSolutionのDownloadボタンをクリックするとPBIXをダウンロードが可能となっています。
レポート
対象のレポートは年月ごとの売上実績と中央値が表示され、中央値に対して年月実績の比較を表示しているレポートになっており、中央値の値があっているように見えますが実際はあっていません。
中央値の値を確認してみる
レポートの値が正しいかどうかを確認してみます。
レポートの中央値とExcelにて検算した中央値で確認したところ一致しておらず、中央値がずれている要因を調べてみます。
一致しない理由を調査する
メジャーを確認してみる。
まず最初にメジャーが正しいか確認したところ、MEDIANX関数にて中央値を計算しているのがわかります。
ALL関数にてテーブル全体のフィルタを無視しているのが気にはなるぐらいです。
Median Revenue =
MEDIANX ( ALL ( revenue_monthly ), revenue_monthly[Sum_Revenue] )
データモデリングを確認
モデルビューにてデータモデリングを確認すると日付テーブル(DateDimension)と売上テーブル(revenue_monthly)とのリレーションシップが 1対1の双方向 になっていることが確認できます。
テーブル内容を確認
両方の列に重複がないはありませんがレコード数が一致していません。
値が合わない理由
テーブル間で完全に一致する行が存在しない状態で、1対1の双方向にてリレーションシップを構築されているため空白行が発生し、 中央値の計算で空白行を考慮したため 値がずれたのだと考えられます。
MEDIANX関数の備考に空白を無視しないとの記載があります
対応方法について
1対1のリレーションシップについて
Microsot Learnにも記載されているように、 一対一のリレーションシップは可能な限り作成しない ように記載されています。
Power BIのCopilotに対策を聞いてみる
Power BIのCopilotはセマンティックモデルを見て判断してくれるかも試してみます。
Copilotがセマンティックモデルをみて、1対1のリレーションシップが正しくない判断と対応策を回答しています。
1対多で単一方向に変更
リレーションシップの設定で、カーディナリティを1対多にクロスフィルタの方向を単一に変更します。
ついでにメジャーも書き換える
ついでにメジャーも書き換えます。
ALL関数でテーブル全体のフィルタを無視していたので、REMOVEFILTERS関数を使ってフィルタを無視する項目のみを選択します。
Median Revenue =
CALCULATE (
MEDIANX ( VALUES ( 'DateDimension'[Month-Year-Sort] ), [Total Revenue] ),
REMOVEFILTERS ( DateDimension[Month-Year-Sort] )
)
正しい値のレポート
正しい中央値の値が表示されており、年月と中央値との比較も値が正しい値で計算されています。
まとめ
Webに記載されているメジャー・データモデリングは全て正しいとは限りません。まずは正しいかどうかは確認する必要があります。
データモデリングが正しくないと意図しない値が表示されることもあります。スタースキーマを意識してデータモデリングを行っていくことが重要です。









