【Vol.4】Power BI Calendarテーブルの作り方|リレーションとスタースキーマを完成

財務DX / Power BI Dashboard作成シリーズ

目次

はじめに

前回のVol.3では、Power Queryを使って5つのCSVファイルを取り込み、ヘッダーの設定やデータ型の変換、KPI計算用のカスタム列の追加までを行いました。これで、Dashboardで使用する以下の5つのテーブルが作成されました。

  • Dim_line_name(ラインマスター)
  • Fact_monthly_kpi(売上・原価)
  • Fact_defect_rate(不良率)
  • Fact_equipment_utilization(設備稼働率)
  • Fact_inventory_turnover(在庫回転率)

しかし、現時点では、今回作成するCalendarテーブルとの関連付けがまだ設定されておらず、期間を軸にした分析はできません。そのため、このままでは「ライン別に分析する」「特定の期間だけ表示する」といったPower BIらしい分析を行うことができません。

そこで今回は、次の2つの作業を行います。

  • Calendarテーブルを作成する
  • 各テーブルのリレーション(関係性)を設定する

これらを設定することで、すべてのテーブルがひとつのデータモデルとしてつながり、次回以降のDAX計算やDashboard作成の土台が完成します。

 スクリーンショットについて
本シリーズでは、日本語版・英語版の記事で共通のスクリーンショットを使用するため、掲載しているPower BI Desktopのスクリーンショットは英語表示で統一しています。本文ではメニュー名や操作内容を日本語でも併記しているため、日本語版Power BI Desktopをご利用の場合でも、そのまま読み進められます。

Calendarテーブルとは

実務では、次のような時系列分析を行う場面がよくあります。

  • 前年同期比を計算する
  • 四半期ごとに集計する
  • 複数のFactテーブルを同じ期間で分析する

Vol.3では、各Factテーブルの「Year/Month」列をDate型に変換しました。これは、これから作成するCalendarテーブルの「Date」列と同じデータ型に揃え、リレーションを設定できるようにするためです。

Calendarテーブルは、Power BIが日付を正しく認識するための専用マスターテーブルです。前年同期比や累計、四半期集計など、多くの時系列分析はこのテーブルを基準に計算されます。

すべてのFactテーブルをCalendarテーブルと関連付けることで、異なるデータを同じ期間軸で集計・分析できるようになります。Power BIで時系列分析を行う際の基本となるテーブルであり、実務でもほぼ必ず作成します。

Step 1:CalendarテーブルをDAXで作成する

今回は、Power BI Desktop上でDAXを使ってCalendarテーブルを作成します。

モデリング」タブから「新しいテーブル」をクリックします。

数式バーに次のDAXを入力します。

Calendar =
ADDCOLUMNS(
    CALENDAR(DATE(2023,1,1), DATE(2026,12,31)),
    "Year", YEAR([Date]),
    "Month", MONTH([Date]),
    "YearMonth", FORMAT([Date], "YYYY-MM")
)

CALENDAR関数は、指定した開始日から終了日までの連続した日付を1日1行で生成する関数です。実務ではFactテーブルの最小日付・最大日付に合わせて設定することが一般的です。

続いてADDCOLUMNSを使い、「Year」、「Month」、「YearMonth」の列を追加しています。このうち「Year」列は、あとの回で期間スライサーとして使用します。Month・YearMonthは本シリーズでは使用しませんが、四半期集計や月名表示など、実務でCalendarテーブルを拡張する際によく使われる列なので、あわせて用意しておきます。

Calendarテーブルの期間は、Factテーブルの日付がすべて含まれるように設定する必要があります。期間が短すぎると必要なデータが分析対象から外れ、長すぎると実績のない期間まで表示されることがあります。そのため、Factテーブルの日付範囲に合わせて設定することが重要です。

Calendarテーブルを作成したら、「Date」列のData Type(データ型)が「Date」になっていることを確認し、必要に応じてFormat(書式)を「Short Date」に変更します。

CALENDARAUTO関数について
CALENDARAUTO()を使うと、モデル内の日付列から開始日と終了日を自動的に判定し、Calendarテーブルを作成できます。手軽に作成できるため便利ですが、意図しない日付がデータに含まれていると、必要以上の期間までカレンダーが作成されることがあります。
本シリーズでは、対象期間を明確に管理できるよう、CALENDAR関数を使用します。

Step 2:Calendarテーブルを日付テーブルとしてマークする

テーブルを作成しただけでは、Power BIはこのテーブルが「日付専用のテーブル」であることを認識しません。日付インテリジェンス関数(前年同期比などの計算で使用するSAMEPERIODLASTYEARDATEADDなど)を正しく機能させるために、作成したテーブルを「日付テーブル」として明示的にマークする必要があります。

作成したCalendarテーブルを選択した状態で、「テーブルツール」タブから「日付テーブルとしてマーク」をクリックします。表示されたダイアログで、日付列にDate列を指定し、「OK」をクリックします。

この設定を行っておくことで、Vol.5以降で扱う前年同期比などのDAX計算が正しく動作するようになります。忘れやすいステップですが、必ず行っておきましょう。

日付インテリジェンス関数とは
Power BIなどで「前年比」や「年間累計」などの時系列分析を行うための専用関数です。よく使用する日付インテリジェンス関数は、SAMEPERIODLASTYEAR(前年同期比)、DATESYTD(年間累計)、FIRSTDATE・ LASTDATE(期間の開始日・終了日)などがあります。日付テーブルとリレーションを設定することで、時間の流れに沿った高度な計算が可能です。

Step 3:テーブルの関係を整理する(スタースキーマ)

リレーションを設定する前に、6つのテーブルがそれぞれどういう役割を持っているかを整理しておきます。

テーブル役割
Calendar日付のマスター
Dim_line_nameラインのマスター
Fact_monthly_kpi売上・原価の実績データ
Fact_defect_rate不良率の実績データ
Fact_equipment_utilization設備稼働率の実績データ
Fact_inventory_turnover在庫回転率の実績データ

Vol.3で説明した通り、Dimはマスターテーブル、Factは実績テーブルです。Calendarテーブルは日付のマスターテーブルになります。Power BIでは、マスタテーブル(Dim)を中心に配置し、各Factテーブルと接続します。

この構造をスタースキーマ(Star Schema)と呼び、Power BIで推奨される代表的なデータモデルです。Factテーブル同士を直接接続するのではなく、マスターテーブルを中心に構成することで、シンプルで管理しやすいデータモデルになります。この構造にすることで、集計の一貫性が保たれ、Power BIのパフォーマンスも向上しやすくなります。

次のStepは、モデルビューでスタースキーマを用いたテーブル間のリレーション構築を行います。

Step 4:モデルビューでリレーションを設定する

Power BI Desktop左側の「Model View(モデルビュー)」アイコンを開きます。

Power BIは、列名やデータ型、データ内容などからリレーションシップを自動検出することがあります。今回のサンプルでは、Dim_line_nameと各Factテーブルは自動的に接続されているはずですが、環境によっては自動作成されない場合もあります。

モデルビューで、図のようにDim_line_nameと各Factテーブルが実線でつながっていることを確認してください。

リレーションが作成されていない場合は、これから説明するCalendarテーブルと同じ手順で手動で接続してください。また、誤ったリレーションが作成されている場合は、その実線を右クリックして「Delete(削除)」し、正しい列を選択して接続し直してください。

一方、Calendarテーブルは今回新しく作成したため、自動ではFactテーブルとのリレーションは作成されません。そのため、ここで手動で接続します。

Calendarテーブルの「Date」列を、Fact_monthly_kpiテーブルの「Year/Month」列へドラッグ&ドロップします。

「New Relationship(新しいリレーションシップ)」が表示され、次の設定になっていることを確認し、「OK」をクリックします。通常は自動的に設定されますが、異なる場合は修正してください。

設定項目設定
Cardinality(カーディナリティ)1対多(1:*)
Cross-filter direction(クロスフィルターの方向)単一
Mark this relationship active(このリレーションシップをアクティブにする)オン

続けて、次の3つも同じように接続します。

  • Calendar[Date] → Fact_defect_rate[Year/Month]
  • Calendar[Date] → Fact_equipment_utilization[Year/Month]
  • Calendar[Date] → Fact_inventory_turnover[Year/Month]

すべて接続すると、CalendarとDim_line_nameを中心としたスタースキーマが完成します。

補足
ドラッグ&ドロップしてもリレーションが作成されない場合は、次の点を確認してください。
・両方の列が「Date型」になっているか
・接続する列に誤りがないか
・Calendarテーブルの日付範囲にFactテーブルの日付が含まれているか

Cardinality(カーディナリティ)とは
今回作成したリレーションは、すべて「1対多(1:*)」になっているはずです。CalendarやDim_line_nameのマスター側では値が一意である一方、Factテーブル側では同じ日付やライン名が複数行にわたって登場するためです。
Cross-filter direction(クロスフィルターの方向)とは
既定では「単一」に設定されています。これは、マスター側(CalendarやDim_line_name)でスライサーを操作すると、Factテーブル側が絞り込まれる、という一方向のフィルターです。今回作成するDashboardでは、この設定のままで問題ありません。
アクティブリレーションとは
「Mark this relationship active」がオンになっていると、このリレーションが通常の集計や分析で使用されます。今回のDashboardでは、すべてのリレーションをアクティブのまま使用します。そのため、この設定がオンになっていることを確認しましょう。

Step 5:ファイルを保存する

設定が完了したら、Ctrl + Sでファイルを保存します。

Vol.3で作成した「KPIDashboard.pbix」に、Calendarテーブルとリレーションが追加された状態になります。


よくあるご質問

1. マスターテーブル(Dimension)と実績テーブル(Fact)の違いは何ですか?

マスターテーブル(Dimension)は、日付や製品、顧客、ライン名などの「分析の軸」となるデータを管理するテーブルです。一方、実績テーブル(Fact)は、売上金額や不良率、設備稼働率などの「数値データ」を格納するテーブルです。
今回のDashboardでは、CalendarDim_line_nameがマスターテーブル、4つのFactテーブルが実績テーブルにあたります。Power BIでは、マスターテーブルを中心に実績テーブルを接続する「スタースキーマ」が基本となります。

2. DAXとは何ですか?

DAX(Data Analysis Expressions)は、Power BIで計算列やメジャーを作成するための数式言語です。
Excelの関数に似た書き方ですが、複数のテーブルをまたいだ集計や前年同期比、累計など、Dashboardで必要となる高度な計算ができます。
次回のVol.5では、DAXの基本的な考え方から、実際にKPIを計算するメジャーの作成方法までを、手順に沿って解説します。

3. リレーションのカーディナリティ(多重度)とは何ですか?

カーディナリティとは、2つのテーブルがどのような関係で結び付くかを表す設定です。Power BIでは、次の4種類があります。
1対1(One to One)
両方のテーブルで値が重複しない場合に使用します。例えば、社員マスターと社員詳細テーブルのように、1人の社員に対して1件の詳細情報が対応するケースです。
1対多(One to Many)
最もよく使われるリレーションです。マスターテーブルでは値が一意で、実績テーブルでは同じ値が複数存在します。今回のDashboardでは、CalendarやDim_line_nameと4つのFactテーブルの関係がこれに該当します。
多対1(Many to One)
「1対多」を反対側のテーブルから見た関係です。Power BIでは接続する順序によって「1対多」と「多対1」の表示が変わることがありますが、意味は同じです。
多対多(Many to Many)
両方のテーブルで同じ値が重複している場合に使用します。複雑なデータモデルでは利用されますが、意図しない集計結果になることもあるため、初心者はできるだけ避けることをおすすめします。
本シリーズでは、すべて**「1対多(1:*)」**のリレーションを使用します。リレーション作成後に「1対多」になっていることを確認しましょう。

4. リレーションのCross-filter direction(クロスフィルターの方向)とは何ですか?

クロスフィルターは、リレーションを通じてフィルターがどの方向へ伝わるかを決める設定です。
本シリーズでは、CalendarやDim_line_nameからFactテーブルへフィルターが伝わる「単一(Single)」方向を使用します。
シンプルなスタースキーマでは単一方向が推奨され、モデルが分かりやすく、予期しない集計結果も起こりにくくなります。

5. アクティブリレーションとインアクティブリレーションの違いは何ですか?

アクティブリレーションは、Power BIが通常の集計で使用するリレーションです。一方、インアクティブリレーションはモデル内に存在していても、自動では使用されません。
1組のテーブル間には通常1つのアクティブリレーションしか設定できません。複数の日付列(受注日・出荷日など)を持つデータでは、必要に応じてインアクティブリレーションを作成し、DAXのUSERELATIONSHIP関数を使って切り替えることがあります。
今回作成するDashboardでは、すべてアクティブリレーションを使用するため、インアクティブリレーションを設定する必要はありません。

まとめ

今回は、DAXを使ってCalendarテーブルを作成し、CalendarとDim_line_nameを中心に各Factテーブルとのリレーションを設定しました。

これにより、6つのテーブルがスタースキーマで接続され、Power BIで分析を行うためのデータモデルが完成しました。

データモデルを正しく設計することで、複数のFactテーブルを同じ期間軸やライン別に分析できるようになり、今後作成するKPI計算やDashboardの基盤になります。


次回予告

次回のVol.5では、いよいよDAXを使ってDashboardに表示するKPIを計算していきます。営業利益率・不良率・設備稼働率・在庫回転率の4つを例に、DAXの基本となる「メジャー」の作成方法を学びます。前年比や目標達成率、累計といった、より実践的なDAX計算はVol.6以降で扱います。。

目次