Power BIでのデータ分析において、最も重要な要素の一つが「日付テーブル」の作成です。Microsoft公式の「Power BI Desktop での日付テーブルの設計ガイダンス」でも、標準の「自動の日付/時刻」機能に頼らず、独自の日付テーブルを構築することが推奨されています。
本記事では、Power Query(M言語)を使用して、メンテナンスフリーで動的な日付テーブルを作成する具体的な手順を解説します。
DAXを使っても日付テーブルを作成できますが、「Power BIで日付テーブルを作成する | DAXを使用して生成」で詳しく解説しています。
日付テーブルのメリット
Power BIで専用の日付テーブルを作成するメリットは、主に「計算の正確性」「パフォーマンス」「分析の柔軟性」の3点に集約されます。
計算の正確性:タイムインテリジェンス関数の正確な動作
前年比(SAMEPERIODLASTYEAR)や年初来累計(TOTALYTD)などの関数を正しく機能させるには、「日付に欠落がない」「重複がない」といった厳格な条件を満たすテーブルが不可欠です。売上がない日も含めた連続したカレンダーがあることで、時間軸に沿った正確な計算が可能になります。
パフォーマンス:データモデルの最適化と軽量化
標準の「自動の日付/時刻」機能は、日付列ごとに隠しテーブルを自動生成するため、モデルを肥大化させます。自作の日付テーブルに集約し、この自動機能をオフにすることで、ファイルサイズを劇的に削減し、レポートの動作を高速化できます。
分析の柔軟性:ビジネス要件への柔軟な対応
「4月始まりの年度(会計年度)」や「日本の祝日判定」、「会社独自の営業日カレンダー」など、標準機能では対応できない独自の分析軸を自由に追加できます。これにより、ビジネスの実情に即したスライサーやグラフ表示が実現します。
分析の柔軟性:複数テーブルの統合管理
「売上実績」と「予算」のように異なるテーブルを、1つの日付スライサーで同時に制御できます。共通の軸(日付テーブル)を介することで、データの整合性を保ちながら多角的な分析が行えるようになります。
サンプルデータ
Power Query内で「空のクエリ」から直接、次の画像のような連続した日付リストと属性列を持つ日付テーブルを生成します。

また、サンプルデータとして日付テーブルとテーブル結合する売上明細を使います。

実際の手順
Power Queryを使用して日付テーブルを生成する手順は以下の6ステップです。
手順1:空のクエリを作成する
まずは、コードを記述するための土台を作成します。
Power BI Desktopを起動して「空のレポート」をクリックします。

「ホーム」タブー「データを取得」ー「空のクエリ」 をクリックします。

Power Queryエディターが開きます。クエリの名前は分かりやすいように「日付テーブル」に変更しましょう。

手順2:日付リストを生成する数式を入力する
次に、開始日から本日までの日付を自動でリストアップする数式を記述します。
数式バーに後述の式を入力します。

List.Dates(#date(2025, 1, 1), Number.From(DateTime.LocalNow()) - Number.From(#date(2025, 1, 1)) + 1, #duration(1, 0, 0, 0))コードのポイント:
#date(2025, 1, 1):カレンダーの開始日を指定します。DateTime.LocalNow():終了日を「本日」に設定することで、データ更新のたびに日付が自動で伸長します。
手順3:リストをテーブルに変換し、データ型を設定する
生成されたのは「リスト」形式なので、Power BIで扱える「テーブル」形式に変換します。
「変換」タブー「テーブルへ変換」をクリックします。

そのままOKをクリックします。

テーブル形式に変換されました。

データ型が「すべて」になっているので、これを日付型に変更します。
「変換」タブー「データ型」ー「日付」をクリックします。

列名がColumn1だと分かりにくいため修正します。
列名をダブルクリックして「Date」と入力します。

日付テーブルが作成できました。日付列しかないため、年、月、曜日など、分析に便利な列を次の手順で追加していきます。

手順4:カレンダーの属性列(年・月・四半期)を追加する
分析の軸となる列を追加します。これらはGUI操作だけで簡単に行えます。
「Date」列を選択した状態で、「列の追加」タブー「日付」ー「年」ー「年」をクリックします。

年だけの列が追加されました。

同じ要領で、「日付」ボタンから、以下の項目を順次追加します。
- 月:[月] > [月](月番号)
- 月名:[月] > [月名]
- 四半期:[四半期] > [四半期]
- 曜日:[曜日] > [曜日の名前]
分析に必要な列が追加できました。

Power Queryでの編集は以上になります。「ホーム」タブー「閉じて適用」をクリックします。

手順5:Power BIへ読み込み「日付テーブル」として定義する
作成したクエリをモデルに読み込み、Power BIにこれが正式な日付テーブルであることを教えます。
テーブルビューを開き、「日付テーブルとしてマークする」をクリックします。

「日付テーブルとしてマーク」をオンにし、「日付列を選択する」を「Date」を選択し、保存をクリックします。

手順6:「日付テーブル」をファクトテーブルとテーブル結合する
日付テーブルはディメンションテーブルであり、ファクトテーブルとテーブル結合して初めて意味が出ます。
日付テーブルの「Date」列をドラッグして売上明細の売上日にドロップします。

OKをクリックします。

テーブル結合できました。後は分析に活用しましょう。

補足と注意点
「自動の日付/時刻」をオフにする
独自の「日付テーブル」を作成した後は、Power BIの標準機能をオフにすることを強く推奨します。
- 設定方法:[ファイル] > [オプションと設定] > [オプション] > [データ ロード] > [タイム インテリジェンス] の 「自動の日付/時刻」 のチェックを外します。
- 理由:これをオフにしないと、モデル内に不要な隠し日付テーブルが作成され続け、パフォーマンス低下の原因となります。
並べ替え順の設定(列による並べ替え)
「月名(1月、2月…)」をグラフで使用すると、アルファベット順や文字コード順に並んでしまうことがあります。
- 「月名」列を選択した状態で、[列で並べ替え] をクリックし、数値である 「月」列(月番号) を指定してください。これで正しくカレンダー順に並びます。
会計年度(4月始まり)への対応
日本のビジネスで多い「4月始まり」の年度を作成したい場合は、[カスタム列の追加] で以下のM言語コードを記述します。
if Date.Month([Date]) >= 4 then Date.Year([Date]) else Date.Year([Date]) - 1まとめ
Power Queryを使用して日付テーブルを生成することで、以下のメリットが得られます。
- 動的な更新:データ更新のたびに最新の日付まで自動で拡張される。
- モデルの軽量化:不要な自動階層を排除し、レポートの動作を高速化できる。
- 柔軟性:日本の祝日や会社独自の会計年度を自由に組み込める。
一見難しそうに見えますが、一度この「空のクエリ」から作る手順を覚えてしまえば、他のレポートでもコードをコピーするだけで使い回すことができます。正確で高速なレポート作成のために、ぜひ「自作の日付テーブル」を標準にしてください。


