この記事で分かること
「商品購入時点の価格を取得したいけれど、どのDAX関数を使えばよいか分からない。」
Power BIを使い始めると、このような悩みにぶつかることがあります。
私も以前は、FILTER関数やMAXX関数を組み合わせて価格を取得していました。やり方はIT小技5でご紹介した通りです。

しかし、複数の関数をネストしたり、VAR/RETURNを使った長い数式になったりして、後から読み返すのが大変でした。
そこで、「LOOKUPVALUE関数でもっとシンプルに書けないだろうか」と考えて試行錯誤した結果、期間展開マスタを利用すれば、初心者にも理解しやすい数式で実現できることが分かりました。
この記事では、LOOKUPVALUE関数を使って商品購入時点の価格を取得する方法を、実務でよくある価格改定の例を使って解説します。
この記事を読むことで、LOOKUPVALUE関数の具体的な使いどころが分かり、実務でも応用しやすい考え方を身に付けられます。
LOOKUPVALUE関数で商品購入時点の価格取得が必要になる場面
LOOKUPVALUE関数が役立つのは、商品価格が時系列で変化するデータを扱う場合です。

例えば、小売業では毎月1日に価格改定を行うケースがよくあります。
販売実績には購入日だけが保存されているため、
- 2025年1月は100円
- 2025年4月から120円
- 2026年6月から130円
のような商品について、「購入日時点の価格」を取得しなければ正しい売上を計算できません。
今回は、このような実務でよくある価格改定を例に解説します。
LOOKUPVALUE関数の前に知っておきたい「期間展開マスタ」
LOOKUPVALUE関数を使う前に、今回の記事で利用する期間展開マスタについて説明します。
通常の商品マスタは、「価格が変更されたタイミング」だけを管理しています。
例えば、次のようなデータです。
<元の商品マスタ>
| 商品 | 価格 | 改定月 |
| A | 100円 | 26年1月 |
| A | 120円 | 26年4月 |
| B | 150円 | 26年1月 |
| B | 180円 | 26年5月 |
このままでは、「2026年2月のAの商品価格」をLOOKUPVALUE関数だけで取得することはできません。
そこで、価格が適用されるすべての月を持つようにデータを展開します。
<期間展開マスタ>
| 商品 | 価格 | 改定月 |
| A | 100円 | 26年1月 |
| A | 100円 | 26年2月 |
| A | 100円 | 26年3月 |
| A | 120円 | 26年4月 |
| A | 120円 | 26年5月 |
| B | 150円 | 26年1月 |
| B | 150円 | 26年2月 |
| B | 150円 | 26年3月 |
| B | 150円 | 26年4月 |
| B | 180円 | 26年5月 |
このように、毎月の商品価格を保持したマスタを、この記事では「期間展開マスタ」と呼びます。
期間展開マスタを用意しておけば、LOOKUPVALUE関数で「商品」と「月」の2条件から価格を取得できます。
なお、期間展開マスタの作成方法はPower Queryを利用すると自動化できますが、内容が長くなるため、本記事では完成済みのマスタを使用します。作成方法については、別記事で詳しく解説する予定です。
課題|商品購入時点の価格を取得-LOOKUPVALUE関数と期間展開マスタで―
使用データ
今回は、次の3つのテーブルを使用します。
<元の商品マスタ>

<商品マスタ(整形)>(期間展開マスタのこと)

<販売実績テーブル>

やりたいこと
販売実績テーブルへ、期間展開マスタから商品価格を取得します。
取得した価格は、この後「販売数量 × 商品価格」として売上金額を計算する予定です。
回答|LOOKUPVALUE関数で商品価格を取得する
それでは、期間展開マスタから商品購入時点の価格を取得してみます。
まずは販売実績テーブルに、販売日を月初日に変換した列を追加します。
C01_販売日_整形 = DATE(YEAR(‘販売実績テーブル'[販売日]),MONTH(‘販売実績テーブル'[販売日]),1)
次に、LOOKUPVALUE関数で商品価格を取得します。
C02_計算価格 =
LOOKUPVALUE(‘商品マスタ(整形)'[価格],
‘商品マスタ(整形)'[商品],
‘販売実績テーブル'[商品],
‘商品マスタ(整形)'[価格適用開始(整形)],
‘販売実績テーブル'[C01_販売日_整形]
)
下図は販売実績テーブルに価格が追加された状態です。
解説|LOOKUPVALUE関数の使い方
今回のLOOKUPVALUE関数は商品と販売月の2つが一致する価格を取得しています。
それぞれの式を見ていきます。
DATE関数で販売日を月初日に変換
C01_販売日_整形 =
DATE(
YEAR(‘販売実績テーブル'[販売日]),
MONTH(‘販売実績テーブル'[販売日]),
1)
これは期間展開マスタと日付を一致させるためです。つまり販売実績テーブルが2025年4月18日のように1~31の値を取るため、期間展開マスタと同じく日を1に揃える必要があります。
ポイントは、「比較する列のルールを合わせる」ことです。
LOOKUPVALUE関数を適用
構文は以下の通りです。
LOOKUPVALUE(
戻り値,
検索列1,検索値1,
検索列2,検索値2
)
今回は次の通り対応させます。
| 引数 | 今回の値 |
| 戻り値 | 商品マスタ(整形)[価格] |
| 検索列1 | 商品マスタ(整形)[価格] |
| 検索値1 | 販売実績テーブル[価格] |
| 検索列2 | 商品マスタ(整形)[価格適用開始(整形)] |
| 検索列2 | 販売実績テーブル[C01_販売日_整形] |
つまり、
商品が一致し、さらに販売月も一致する価格
を取得しています。
LOOKUPVALUE関数では、
条件をカンマで追加するだけでAND条件になります。
SQLのWHERE句やExcelのVLOOKUPとは少し考え方が異なりますが、慣れると非常に読みやすいDAXになります。
【重要】LOOKUPVALUE関数とRELATED関数の使い分け
LOOKUPVALUE関数とRELATED関数はどちらもマスタから値を取得する関数です。ただし、各々適した場面が異なります。
| LOOKUPVALUE | RELATED |
| リレーション不要 | リレーション必要 |
| 複数条件で検索できる | 複数条件を結合したキー列を作る必要がある(後述) |
| 一時的な検索に便利 | リレーション構築済みなら高速処理 |
例えば、商品マスタと販売実績テーブルが「商品ID」だけでリレーションできるなら、RELATED関数の方がシンプルです。
一方、今回のように
- 商品
- 販売月
の2条件で検索したい場合はLOOKUPVALUE関数の方が分かりやすく記述できます。
なお、複数条件でRELATED関数を利用する場合は条件列を結合したキー列を作成し、リレーションを設定する必要があります。今回なら以下のようなキー列(計算列)を追加します。
<販売実績テーブル>
C03_key_rel = [商品]&”_”&[C01_販売日_整形]
<商品マスタ(期間展開マスタ)>
key_rel = [商品]&”_”&[価格適用開始(整形)]
まとめ
今回のポイントを整理します。
- LOOKUPVALUE関数は複数条件で値を検索できます。
- 商品価格のような時系列データは、期間展開マスタを作ると扱いやすくなります。
- DATE・YEAR・MONTH関数で販売日を月単位に揃えることがポイントです。
- リレーションが不要な場面ではLOOKUPVALUE関数が便利ですが、既にリレーションがある場合はRELATED関数の方がシンプルです。
- DAXだけで解決しようとせず、データの持ち方を工夫する(期間展開マスタにする)と、式が読みやすく保守もしやすくなります。
LOOKUPVALUE関数は、価格取得だけでなく、税率や部署情報などマスタから値を取得する場面でも活躍します。ぜひPower BIの実務で活用してみてください。
次におすすめの記事



コメント