DAX で過去データを取得する: 前年・前月・前週・前日の出し方ガイド
はじめに
Power BI や Excel の Power Pivot で時間の推移を分析するには、DAX の「時間知能関数(Time Intelligence Functions)」の理解が欠かせません。特に、前年・前月・前週・前日の数値を取得して比較分析を行うことは、売上分析や業績評価で非常によく使われるパターンです。
本記事では、DAX を使って 前年 (YoY)、前月 (MoM)、前週 (WoW)、前日 (DoD) の値を求める方法を、実践的なコード例とともに解説します。
前提: 日付テーブルの準備
これらの計算を行うには、連続した日付を持つカレンダーテーブルが必要です。まず、以下のように Date
テーブルを用意しましょう。
Date = CALENDARAUTO()
また、分析対象のファクトテーブル(例: Sales
)と日付テーブルを Sales[Date]
→ Date[Date]
のようにリレーションで結んでおく必要があります。
前年の値を取得する
前年同月の売上など、前年の同一日・同一週・同一月のデータを取得するには SAMEPERIODLASTYEAR
関数を使います。
Sales Last Year = CALCULATE(
SUM(Sales[Amount]),
SAMEPERIODLASTYEAR(Date[Date])
)
この関数は、現在のコンテキストの日付と同じ期間の1年前を自動で参照してくれます。ただし、「日単位」などの単一日フィルターでは空になることがあるため、その場合は DATEADD(Date[Date], -1, YEAR)
の利用を検討してください。
前月の値を取得する
前月の同じ日・月の売上を取得するには PARALLELPERIOD
または PREVIOUSMONTH
を使います。
Sales Last Month = CALCULATE(
SUM(Sales[Amount]),
PREVIOUSMONTH(Date[Date])
)
または、より柔軟に使いたい場合は:
Sales Last Month (Flexible) = CALCULATE(
SUM(Sales[Amount]),
PARALLELPERIOD(Date[Date], -1, MONTH)
)
違い:
-
PREVIOUSMONTH
: 直前の「月」全体 -
PARALLELPERIOD
: N か月前の同期間(柔軟)
前週の値を取得する
DAX の PARALLELPERIOD
は DAY
, MONTH
, QUARTER
, YEAR
のみを正式にサポートしており、WEEK
は非対応です。そのため、前週を求めたい場合は、日付テーブルに「週番号」や「週開始日」などのカスタム列を用意し、それを用いたロジックが必要です。
カスタム列を使った前週の計算例
-
Date
テーブルに以下のような列を追加:
YearWeek = YEAR([Date]) * 100 + WEEKNUM([Date], 2)
(2
は ISO 準拠の月曜始まり)
- 次に、以下のようなメジャーを定義:
Sales Last Week =
VAR CurrentWeek = MAX(Date[YearWeek])
VAR LastWeek = CALCULATE(
SUM(Sales[Amount]),
FILTER(ALL(Date), Date[YearWeek] = CurrentWeek - 1)
)
注意点
- 年を跨ぐ週番号の処理には工夫が必要(例:202401 から 202352 への切り替えなど)
-
ISOWEEKNUM
を使用することで ISO 準拠の週番号を取得可能(2016年以降の Excel/Power BI で利用可)
前日の値を取得する
前日のデータ取得には PREVIOUSDAY
関数を使います。
Sales Yesterday = CALCULATE(
SUM(Sales[Amount]),
PREVIOUSDAY(Date[Date])
)
DATEADD 関数の活用
もう少し汎用的に「1日前」「1か月前」「1年前」などを扱いたい場合、DATEADD
を使うことも可能です。
例:1年前
Sales LY = CALCULATE(
SUM(Sales[Amount]),
DATEADD(Date[Date], -1, YEAR)
)
注意点:
-
DATEADD
はDAY
、MONTH
、QUARTER
、YEAR
のみをサポート(WEEK
は非対応) - 連続した日付が必要(欠損があるとエラーになる可能性あり)
-
PARALLELPERIOD
より柔軟だが、