Power BIを使っていると、データモデル内での計算や集計を柔軟に行うためにDAX(Data Analysis Expressions) を活用する場面が増えます。DAXはさまざまな関数を提供していますが、その中でも VALUES関数 は、フィルターコンテキストの制御やユニークな値のリストを取得したい場合などに、非常に便利です。本記事では、Power BIのDAXにおけるVALUES関数を徹底解説し、代表的な使い方や注意点についてわかりやすく紹介していきます。最後には、弊社で行っているコンサルティングやセミナーサービスの概要をご案内しますので、データ活用にお悩みの方はぜひ参考にしてみてください。
1. DAXとVALUES関数の概要
1-1. DAXとは
DAX(Data Analysis Expressions)は、Power BI、ExcelのPower Pivot、SQL Server Analysis Services(SSAS) Tabularモデルなどで使用できる数式言語です。テーブル内の列やフィルターコンテキストを元に動的な計算を行うことができます。
1-2. VALUES関数とは
VALUES関数 は、指定した列やテーブルに含まれる ユニークな値 を返すDAX関数です。コンテキストに応じて、動的に異なる値のセットを取得できます。
2. VALUES関数の代表的な使い方
2-1. 列のユニークな値を取得する
最もシンプルな使い方は、VALUES関数で単一の列を指定して、その列に含まれるユニークな値を取得するパターンです。
例えば、Sales テーブルの ProductCategory 列のユニークリストを取得したい場合は以下のように書きます。
これをビジュアル化の軸などに使うこともできますが、多くの場合は別の関数と組み合わせて活用します。
2-2. CALCULATEやFILTERとの組み合わせ
DAXの醍醐味は、CALCULATEやFILTERといった関数と組み合わせて、動的にフィルターコンテキストを操作するところにあります。以下の例を見てみましょう。
この式は、Salesテーブルの合計売上を計算する際に、Customer[CustomerID] のユニークな値の集合をフィルターとして適用します。
これにより、あるビジュアル(たとえば地域別の売上)で見たときに、その地域におけるユニークな顧客の売上合計 を算出できたりします。
2-3. DISTINCTCOUNTとの比較
DAXでユニークな値を扱う際、DISTINCT
や DISTINCTCOUNT
関数も頻繁に登場します。
-
VALUES関数: ユニークな値のテーブル を返す
-
DISTINCT関数: こちらもユニークな値のテーブルを返すが、若干動作が異なる場合がある
-
DISTINCTCOUNT関数: ユニークな値の数を 数値 で返す
VALUES
は現在のコンテキスト にある値の集合を保持してくれるため、コンテキスト変化(フィルターなど)に合わせて柔軟な振る舞いをします。一方、DISTINCT
や DISTINCTCOUNT
はより直接的にユニーク数を求めるときに使われる関数です。
3. VALUES関数の注意点や動作の変化
3-1. フィルターコンテキストがゼロ件の場合
VALUES関数は、フィルターコンテキストによって結果が左右されます。もし、あるセグメントや切り口でデータがまったく存在しない場合、VALUES関数は空のテーブル を返す可能性があります。
このとき、DAXの計算式全体の振る舞いを考慮する必要があります。計算式が複雑な場合、思わぬエラーやブランク値を返すことがあります。
3-2. 複数列を指定する場合
VALUES関数は、1つの列だけでなく、テーブル を引数に取ることもできます。その場合は、テーブル内のユニークな行のセットが返されます。
しかし、データ量が多い場合にはパフォーマンスが低下する恐れがあるため、なるべく必要な列だけを指定 して利用するのがセオリーです。
3-3. ALL関数との組み合わせ
DAXには、VALUES関数の挙動をリセットするようなALL関数 があります。ALLはフィルターを解除してすべての値を取得するために用いられますが、VALUESと組み合わせて使うと高度な集計が可能になります。
例えば、以下のような式では、現在のコンテキストとは異なるスコープでユニーク値を取得して比較を行う、といった使い方ができます。
上記は単純な例ですが、たとえばユーザーが選択しているフィルターと全体のフィルターとの差分を計算したい場合などに応用できる考え方です。
4. 具体的な活用例
4-1. ユニークな顧客ID数を条件にした売上集計
「一定の顧客数を超えた場合にのみ、売上金額を合算したい」という要件があるとします。ここでVALUES関数とCALCULATE、FILTERを使って、以下のような式が作れます。
この例では、ユニーク顧客IDが1,000件を超えている という条件を満たしたときだけ、売上を合算します。
ただし、実際のデータ構造によっては式をさらに細かく調整する必要があります。
4-2. 動的タイトルの生成
グラフやテーブルを作る際に、「現在どのカテゴリが選択されているか」を動的にタイトルへ表示したいケースがあります。
CONCATENATEX
関数と組み合わせることで、現在のコンテキスト下でユニークなカテゴリの値をまとめて文字列で返すことが可能です。これをカードビジュアルに表示すれば、ダイナミックなタイトルを実現できます。
5. VALUES関数のパフォーマンス面での考慮
5-1. 大量データへの影響
テーブル全体や高カードinality(ユニーク値が非常に多い)の列をそのままVALUES関数で取得 すると、計算コストが大きくなる可能性があります。
-
なるべく 対象の列を限定 する
-
フィルターコンテキスト を適切に利用する
-
必要に応じて 集計用テーブル を作成する
5-2. キャッシュの活用
Power BIでは、同じ計算を何度も呼び出す場合、キャッシュ(内部的なメモリ)を利用してパフォーマンスを高める仕組みがあります。VALUES関数と他のDAX関数を組み合わせる際、同一のユニークセットを繰り返し求めるようなケースでは、変数 (VAR) を活用して中間結果をキャッシュ する設計が有効です。
このように VAR
を使うことで、VALUES(Sales[ProductID])
の結果を一時的に保持し、複数の箇所で参照する際に再計算を最小限に抑えることができます。
6. VALUES関数とその他DAX関数の比較
関数名 |
戻り値の型 |
主な用途 |
VALUES |
テーブル形式 |
コンテキスト内のユニーク値を動的に取得 |
DISTINCT |
テーブル形式 |
列のユニーク値を取得(VALUESと似ているが多少動作が異なる場合あり) |
DISTINCTCOUNT |
数値 |
列内のユニーク値の数を集計したい場合 |
ALL |
テーブル形式 |
特定の列やテーブルからすべてのフィルターを外す |
CALCULATETABLE |
テーブル形式 |
フィルターを適用した新しいテーブルを返す |
VALUES関数は単独でも使えますが、多くの場合はCALCULATEやALLなどと組み合わせてフィルターコンテキストを制御していくのが一般的です。
7. まとめと今後の活用ポイント
VALUES関数 は、DAXの中でもよく使われる関数でありながら、コンテキストとの組み合わせや他の関数との連携によって、その応用範囲は非常に広がります。ユニークな値の集合を取得することで、集計や条件分岐、動的なタイトル生成など、さまざまな要件に柔軟に対応できます。
一方で、大量データや複雑なモデルで不適切にVALUES関数を多用すると、パフォーマンスが低下したり、思わぬ結果を返したりするリスクもあるため、最適なモデリング や 他の関数との使い分け に注意する必要があります。
弊社のコンサルティング・セミナーサービス
本記事で紹介したDAX関数の活用やPower BIのデータモデリングに関して、さらに詳しく知りたい方や、実際のプロジェクトへの導入支援をご検討されている方は、ぜひ弊社のコンサルティングやセミナーをご活用ください。経験豊富なコンサルタントが、お客様のデータ環境や業務要件に合わせて最適な設計・運用をサポートいたします。また、DAXの基礎から応用までを体系的に学べるセミナーも定期的に開催しておりますので、具体的な事例や実践的なノウハウを身につけたい方に最適です。
詳細は下記のサービスページよりご覧いただけます。ぜひお気軽にお問い合わせください。
コメント