フィルター コンテキストを調べる
VALUES
DAX 関数を使用すると、フィルター コンテキストの値を数式で決定できます。
VALUES
関数の構文は次のとおりです。
VALUES(<TableNameOrColumnName>)
この関数では、テーブル参照または列参照を渡す必要があります。 テーブル参照を渡すと、フィルター コンテキスト内にあるものについて、行を含む同じ列を持つテーブル オブジェクトが返されます。 列参照を渡すと、フィルター コンテキスト内にある一意の値の単一列テーブルが返されます。
この関数からは常にテーブル オブジェクトが返されます。また、1 つのテーブルに複数の行が含まれる可能性があります。 そのため、特定の値がフィルター コンテキスト内にあるかどうかをテストするには、まず数式で VALUES
関数から 1 つの行が返されることをテストする必要があります。 このタスクを実行するには、2 つの関数が役立ちます。HASONEVALUE
と SELECTEDVALUE
の DAX 関数です。
HASONEVALUE
関数からは、特定の列参照が 1 つの値にフィルターされている場合に TRUE
が返されます。
SELECTEDVALUE
関数を使用すると、1 つの値が何であるかを判別するタスクが簡単になります。 関数に列参照が渡されると、1 つの値が返されます。フィルター コンテキストに複数の値がある場合は、空白 (または関数に渡す代替値) が返されます。
次の例では、HASONEVALUE
関数を使用します。 販売手数料を計算する次のメジャーを、Sales (売上) テーブルに追加します。 Adventure Works では、歩合率は米国を除くすべての国/地域で収益の 10% であることに注意してください。 米国の場合、営業担当者は 15% の歩合を獲得します。 このメジャーを小数点以下 2 桁の通貨として書式設定し、それをレポートの [ページ 3] にあるテーブルに追加します。
Sales Commission =
[Revenue]
* IF(
HASONEVALUE('Sales Territory'[Country]),
IF(
VALUES('Sales Territory'[Country]) = "United States",
0.15,
0.1
)
)
Sales Commission (販売手数料) の結果の合計が空白であることに注目してください。 その理由は、Sales Territory (販売区域) テーブルの Country (国) 列のフィルター コンテキストに複数の値があるためです。 この場合、HASONEVALUE
関数から FALSE
が返され、Revenue (収益) メジャーに空白が乗算されます (空白が乗算された値は空白です)。 合計を生成するには、このモジュールの後半で説明する反復子関数を使用する必要があります。
フィルターの状態をテストするために使用できる他の 3 つの関数は次のとおりです。
-
ISFILTERED
- 渡された列参照が "直接" フィルター処理されている場合にTRUE
が返されます。 -
ISCROSSFILTERED
- 渡された列参照が "間接的に" フィルター処理されている場合にTRUE
が返されます。 同じテーブルまたは関連テーブルの別の列に適用されているフィルターが、フィルター処理によって参照列に影響する場合、列はクロスフィルター処理されます。 -
ISINSCOPE
- 渡された列参照がレベルの階層内のレベルである場合、TRUE
が返されます。
レポートの [ページ 2] に戻り、Revenue % Total Country (国の収益合計 (%)) メジャー定義を変更して、Sales Territory (販売区域) テーブルの Region (地域) 列がスコープ内にあることをテストします。 スコープに含まれていない場合、メジャーの結果は空白になります。
Revenue % Total Country =
VAR CurrentRegionRevenue = [Revenue]
VAR TotalCountryRevenue =
CALCULATE(
[Revenue],
REMOVEFILTERS('Sales Territory'[Region])
)
RETURN
IF(
ISINSCOPE('Sales Territory'[Region]),
DIVIDE(
CurrentRegionRevenue,
TotalCountryRevenue
)
)
マトリックスの視覚エフェクトでは、地域がスコープ内にある場合にのみ、Revenue % Total Country (国の収益合計 (%)) の値が表示されるようになりました。