フィルター修飾子関数を使用する
CALCULATE 関数を使用すると、フィルター修飾子関数を渡すことで、単にフィルターを追加する以上のことを実行できます。
フィルターを削除する
フィルター コンテキストからフィルターを削除するには、REMOVEFILTERS 関数を CALCULATE のフィルター式として使用します。 1 つ以上の列から、または 1 つのテーブルのすべての列からフィルターを削除することができます。
注
REMOVEFILTERS は比較的新しい関数です。 以前のバージョンの DAX では、フィルターを削除するために ALL 関数、または ALLEXCEPT や ALLNOBLANKROW などのバリアントを使用していました。 これらの関数は、フィルター修飾子としても、個別の値のテーブル オブジェクトを返す関数としても動作します。 これらの関数についてここで説明するのは、それらを使用することで、フィルターを削除するドキュメントや数式の例を見つけられる可能性が高いためです。
次の例では、Sales テーブルに新しくメジャーを追加して、Revenue メジャーを評価しますが、そのために Sales Territory テーブルからフィルターを削除してこれを実行します。 小数点以下 2 桁の通貨としてメジャーを書式設定します。
Revenue Total Region = CALCULATE([Revenue], REMOVEFILTERS('Sales Territory'))
次に、レポートのページ 2 にあるマトリックス ビジュアルに、Revenue Total Region メジャーを追加します。 このマトリックス ビジュアルでは、Sales Territory テーブルの行が 3 つの列 (Group、Country、Region) でグループ化されます。
Revenue Total Region メジャーの値がそれぞれ同じであることに注目してください。 これは合計売上の値です。
この結果だけでは役に立ちませんが、比率の分母として使用すると、総計に対する割合が計算されます。 そのため、Revenue Total Region メジャー定義を次の定義で上書きします。 この新しい定義では、メジャー名が変更され、2 つの変数が宣言されます。 メジャーは、必ず小数点以下 2 桁のパーセンテージとして書式設定してください。
Revenue % Total Region =
VAR CurrentRegionRevenue = [Revenue]
VAR TotalRegionRevenue =
CALCULATE(
[Revenue],
REMOVEFILTERS('Sales Territory')
)
RETURN
DIVIDE(
CurrentRegionRevenue,
TotalRegionRevenue
)
マトリックス ビジュアルに Revenue % Total Region の値が表示されることを確認してください。
ここで別のメジャーを作成します。今度は地域の売上をその国内または地域の売上で割った比率を計算します。
このタスクを完了する前に、Southwest 地域の Revenue % Total Region の値が 22.95% であることに注目してください。 このセルのフィルター コンテキストを調べます。 データ ビューに切り替え、データ ペインで Sales Territory テーブルを選択します。
次の列フィルターを適用します。
-
Group- North America -
Country- United States -
Region- Southwest
フィルターを選択すると、テーブルが 1 行に絞り込まれることに注目してください。 次に、国内の売上に対する地域の売上の比率を作成するために、Region 列からフィルターをクリアします。
現在 5 行が存在し、各行は国 United States に属しています。 そのため、Region 列のフィルターをクリアし、Country 列と Group 列のフィルターを残すと、その地域の国に対する新しいフィルター コンテキストが作成されます。
次のメジャー定義では、列からフィルターをクリアまたは削除する方法に注目します。 DAX ロジックで Revenue % Total Region メジャーの式が、REMOVEFILTERS 関数を使用して、Sales Territory テーブルのすべての列からではなく Region 列からフィルターを削除するように、少しだけ変更されています。
Revenue % Total Country =
VAR CurrentRegionRevenue = [Revenue]
VAR TotalCountryRevenue =
CALCULATE(
[Revenue],
REMOVEFILTERS('Sales Territory'[Region])
)
RETURN
DIVIDE(
CurrentRegionRevenue,
TotalCountryRevenue
)
Revenue % Total Country メジャーを Sales テーブルに追加し、書式を小数点以下 2 桁の割合に設定します。 新しいメジャーをマトリックス ビジュアルに追加します。
United States の地域の値を除き、すべての値が 100% であることに注目してください。 これは、Adventure Works 社では米国だけに地域があるのに対し、その他の国/地域にはないためです。
注
表形式モデルは、不均一な階層 (深さが可変である階層) をサポートしません。 そのため、一般的な設計手法として、階層の下位レベルで親 (または他の先祖) の値を繰り返すことがあります。 たとえば、Australia には地域が存在しないので、国/地域の値が地域名として繰り返されます。 BLANK ではなく、常に意味のある値を格納することをお勧めします。
次の例が最後に作成するメジャーです。
Revenue % Total Group メジャーを追加し、書式を小数点以下 2 桁の割合に設定します。 次に、新しいメジャーをマトリックス ビジュアルに追加します。
Revenue % Total Group =
VAR CurrentRegionRevenue = [Revenue]
VAR TotalGroupRevenue =
CALCULATE(
[Revenue],
REMOVEFILTERS(
'Sales Territory'[Region],
'Sales Territory'[Country]
)
)
RETURN
DIVIDE(
CurrentRegionRevenue,
TotalGroupRevenue
)
Sales Territory テーブルの、Region および Country の各列からフィルターを削除すると、メジャーによって地域の売上がグループの売上の比率として計算されます。
フィルターを保持する
フィルターを保持するには、KEEPFILTERS 関数を CALCULATE 関数でフィルター式として使用します。
このタスクを実行する方法を確認するには、レポートの ページ 1 に切り替えます。 次に、Revenue Red メジャーの定義を、KEEPFILTERS 関数を使用するように変更します。
Revenue Red =
CALCULATE(
[Revenue],
KEEPFILTERS('Product'[Color] = "Red")
)
このテーブル ビジュアルで、Revenue Red メジャーに値が 1 つだけ存在していることに注目してください。 その理由は、ブール フィルター式により、Product テーブルの Color 列の既存のフィルターが保持されるからです。 赤以外の色が BLANK である理由は、これらの 2 つのフィルターに対してフィルター コンテキストとフィルター式が組み合わされているためです。 黒色と赤色は交差しており、両方が同時に TRUE になることはないため、式はどの製品行でもフィルター処理されません。 両方の赤フィルターが同時に TRUE にならない限りあり得ません。そのため、Revenue Red メジャーの値は 1 つだけ表示されます。
非アクティブなリレーションシップを使用する
非アクティブなモデル リレーションシップは、USERELATIONSHIP 関数がフィルター式として CALCULATE 関数に渡された場合にのみフィルターを伝播できます。 この関数を使用して非アクティブなリレーションシップを操作すると、アクティブなリレーションシップは自動的に非アクティブになります。
非アクティブなリレーションシップを使用して出荷日ごとに Revenue メジャーを計算するメジャー定義の例を確認してください。
Revenue Shipped =
CALCULATE (
[Revenue],
USERELATIONSHIP('Date'[DateKey], Sales[ShipDateKey])
)
リレーションシップの動作を変更する
式を評価する際にモデル リレーションシップの動作を変更するには、CROSSFILTER 関数を CALCULATE 関数にフィルター式として渡します。 これは高度な機能です。
CROSSFILTER 関数では、フィルターの方向を (両方向から単方向、またはその逆に) 変更したり、リレーションシップを無効にしたりできます。