フィルター コンテキストを調べる
VALUES 関数を使用すると、数式でフィルター コンテキスト内の値を判断できます。
VALUES 関数構文は次のとおりです。
VALUES(<TableNameOrColumnName>)
この関数では、テーブル参照または列参照を渡す必要があります。 テーブル参照を渡すと、フィルター コンテキスト内にあるものについて、行を含む同じ列を持つテーブル オブジェクトが返されます。 列参照を渡すと、フィルター コンテキスト内にある一意の値の単一列テーブルが返されます。
この関数からは常にテーブル オブジェクトが返されます。また、1 つのテーブルに複数の行が含まれる可能性があります。 したがって、特定の値がフィルター コンテキスト内にあるかどうかをテストするには、まず数式で VALUES 関数が 1 行を返すことをテストする必要があります。 このタスクを実行するには、HASONEVALUE 関数と SELECTEDVALUE 関数という 2 つの関数が役立ちます。
HASONEVALUE 関数は、指定された列参照が単一の値にフィルター処理された場合に TRUE を返します。
SELECTEDVALUE 関数は、単一の値が何であるかを判断するタスクを簡素化します。 関数に列参照が渡されると、関数は単一の値を返します。また、フィルター コンテキストに複数の値がある場合、BLANK (または関数に渡される代替値) を返します。
次の例では、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 メジャーの結果が BLANK であることに注目してください。 その理由は、Sales Territory テーブルの Country 列のフィルター コンテキストに複数の値があるためです。 この場合、HASONEVALUE 関数は FALSE を返し、Revenue メジャーに BLANK が乗算されます (BLANK を乗算した値は BLANK になります)。 合計を生成するには、このモジュールの後半で説明する反復子関数を使用する必要があります。
フィルターの状態をテストするために使用できる他の 3 つの関数は次のとおりです。
-
ISFILTERED- 渡された列参照が直接フィルタリングされた場合はTRUEを返します。 -
ISCROSSFILTERED- 渡された列参照が間接的にフィルタリングされた場合はTRUEを返します。 同じテーブルまたは関連テーブルの別の列に適用されているフィルターが、フィルター処理によって参照列に影響する場合、列はクロスフィルター処理されます。 -
ISINSCOPE- 渡された列参照がレベル階層内のレベルである場合、TRUEを返します。
レポートのページ 2 に戻り、Revenue % Total Country メジャー定義を変更して、Sales Territory テーブルの Region 列がスコープ内にあることをテストします。 スコープに含まれていない場合、メジャーの結果は BLANK になります。
Revenue % Total Country =
VAR CurrentRegionRevenue = [Revenue]
VAR TotalCountryRevenue =
CALCULATE(
[Revenue],
REMOVEFILTERS('Sales Territory'[Region])
)
RETURN
IF(
ISINSCOPE('Sales Territory'[Region]),
DIVIDE(
CurrentRegionRevenue,
TotalCountryRevenue
)
)