変更されたフィルター コンテキストで式を評価します。
手記
CALCULATETABLE 関数もあります。 これはまったく同じ機能を実行しますが、
構文
CALCULATE(<expression>[, <filter1> [, <filter2> [, …]]])
パラメーター
| 用語 | 定義 |
|---|---|
expression |
評価する式。 |
filter1, filter2,… |
(省略可能)フィルターを定義するブール式またはテーブル式、またはフィルター修飾子関数。 |
最初のパラメーターとして使用する式は、メジャーと同様に機能します。
フィルターは次のようになります。
- ブール型フィルター式
- テーブル フィルター式
- フィルター変更関数
複数のフィルターを使用する場合は、 AND (&&) 論理演算子を使用して評価できます。つまり、すべての条件を TRUEする必要があります。つまり、 OR (||) 論理演算子を使用して、いずれかの条件を true にすることができます。 詳細については、「論理演算子>DAX演算子」を参照してください。
ブール型フィルター式
ブール式フィルターは、TRUE または FALSEに評価される式です。 いくつかの規則に従う必要があります。
1 つのテーブルの列を参照できます。
メジャーを参照することはできません。
入れ子になった CALCULATE 関数は使用できません。
集計関数に引数として渡さない限り、テーブルをスキャンまたは返す関数は使用できません。
スカラー値を返す集計関数を含めることができます。 例えば次が挙げられます。
Total sales on the last selected date = CALCULATE ( SUM ( Sales[Sales Amount] ), 'Sales'[OrderDateKey] = MAX ( 'Sales'[OrderDateKey] ) )
テーブル フィルター式
テーブル式フィルターは、テーブル オブジェクトをフィルターとして適用します。 これはモデル テーブルへの参照である可能性がありますが、テーブル オブジェクトを返す関数である可能性が高くなります。 FILTER関数を使用して、ブール型フィルター式で定義できない条件を含む複雑なフィルター条件を適用できます。
フィルター修飾子関数
フィルター修飾子関数を使用すると、単にフィルターを追加する以上のことを行うことができます。 フィルター コンテキストを変更する際に、追加の制御が提供されます。
| 機能 | 目的 |
|---|---|
| REMOVEFILTERS | 1 つのテーブルの 1 つ以上の列、または 1 つのテーブルのすべての列から、すべてのフィルターまたはフィルターを削除します。 |
| ALL 1、 ALLEXCEPT、 ALLNOBLANKROW | 1 つ以上の列から、または 1 つのテーブルのすべての列からフィルターを削除します。 |
| KEEPFILTERS | 同じ列の既存のフィルターを削除せずにフィルターを追加します。 |
| USERELATIONSHIP | 関連する列間に非アクティブなリレーションシップを適用します。その場合、アクティブなリレーションシップは自動的に非アクティブになります。 |
| CROSSFILTER | フィルターの方向 (両方から単一、または単一から両方へ) を変更するか、リレーションシップを無効にします。 |
1ALL 関数とそのバリアントは、フィルター修飾子とテーブル オブジェクトを返す関数の両方として動作します。 ツールで REMOVEFILTERS 関数がサポートされている場合は、それを使用してフィルターを削除します。
戻り値
式の結果の値。
備考
フィルター式を指定すると、 CALCULATE 関数によってフィルター コンテキストが変更され、式が評価されます。 フィルター式ごとに、フィルター式が KEEPFILTERS 関数にラップされていない場合、次の 2 つの標準結果が存在します。
- 列またはテーブルがフィルター コンテキストにない場合は、新しいフィルターがフィルター コンテキストに追加され、式が評価されます。
- 列またはテーブルが既にフィルター コンテキストにある場合、既存のフィルターは新しいフィルターによって上書きされ、 CALCULATE 式が評価されます。
フィルターなしでCALCULATE 関数を使用すると、特定の要件が満たされます。 行コンテキストをフィルター コンテキストに切り替えます。 この遷移は、モデル データを集計する式 (モデル メジャーではない) を行コンテキストで評価する必要がある場合に必要です。 このシナリオは、計算列の数式で、または反復子関数の式が評価されるときに発生する可能性があります。 行コンテキストでモデル メジャーを使用する場合、コンテキストの切り替えは自動的に行われます。
-
この関数は、計算列または行レベル セキュリティ (RLS) 規則で使用する場合、DirectQuery モードでは使用できません。
例
この記事の例は、Adventure Works DW 2020 Power BI Desktop モデルのサンプルと共に使用できます。 モデルを取得するには、サンプル モデル
次の Sales テーブルメジャー定義は、青色の製品に対してのみ収益の結果を生成します。
Blue Revenue =
CALCULATE ( SUM ( Sales[Sales Amount] ), 'Product'[Color] = "Blue" )
| カテゴリ | 売上金額 | 青い収益 |
|---|---|---|
| 小物 | $1,272,057.89 | $165,406.62 |
| バイク | $94,620,526.21 | $8,374,313.88 |
| 衣類 | $2,117,613.45 | $259,488.37 |
| コンポーネント | $11,799,076.66 | $803,642.10 |
| Total | $109,809,274.20 | $9,602,850.97 |
次の Sales テーブルメジャー定義では、すべての販売チャネルの売上に対する売上の比率が生成されます。
Revenue % Total Channel =
DIVIDE (
SUM ( Sales[Sales Amount] ),
CALCULATE (
SUM ( Sales[Sales Amount] ),
REMOVEFILTERS ( 'Sales Order'[Channel] )
)
)
| チャンネル | 売上金額 | 収益 % 合計チャネル数 |
|---|---|---|
| インターネット | $29,358,677.22 | 26.74% |
| リセラー | $80,450,596.98 | 73.26% |
| Total | $109,809,274.20 | 100.00% |
DIVIDE 関数は、Sales テーブルの合計 Sales Amount 列の値を (フィルター コンテキスト内で) 変更されたフィルター コンテキスト内の同じ式で除算します。 フィルター修飾子関数である CALCULATE 関数を使用してフィルター コンテキストを変更する REMOVEFILTERS 関数です。 チャネル 列の
次の Customer テーブルの計算列定義は、顧客をロイヤルティ クラスに分類します。 これは非常に単純なシナリオです。顧客によって生成された収益が $2500 未満の場合、
Customer Segment =
IF (
CALCULATE (
SUM ( Sales[Sales Amount] ),
ALLEXCEPT ( Customer, Customer[CustomerKey] )
) < 2500,
"Low",
"High"
)
| 顧客セグメント | 顧客数 | 売上金額 |
|---|---|---|
| 高 | 4,637 | $102,670,663.09 |
| 低 | 13,848 | $7,138,611.11 |
| Total | 18,485 | $109,809,274.20 |
この例では、行コンテキストがフィルター コンテキストに変換されます。 コンテキスト遷移と呼ばれます。 ALLEXCEPT 関数は、CustomerKey 列を除くすべての Customer テーブル列からフィルターを削除します。