CALCULATE
変更されたフィルター コンテキストで式を評価します。
手記
CALCULATETABLE 関数もあります。 これはまったく同じ機能を実行しますが、
構文
CALCULATE(<expression>[, <filter1> [, <filter2> [, …]]])
パラメーター
用語 | 定義 |
---|---|
expression |
評価する式。 |
filter1, filter2,… |
(省略可能)フィルターを定義するブール式またはテーブル式、またはフィルター修飾子関数。 |
最初のパラメーターとして使用される式は、基本的にメジャーと同じです。
フィルターは次のようになります。
- ブール型フィルター式
- テーブル フィルター式
- フィルター変更関数
複数のフィルターがある場合は、AND (&&
) 論理演算子を使用して評価できます。つまり、すべての条件を TRUE
する必要があります。つまり、OR (||
) 論理演算子によって、いずれかの条件を true にできます。
ブール型フィルター式
ブール式フィルターは、TRUE
または FALSE
に評価される式です。 次の規則に従う必要があります。
- 1 つのテーブルの列を参照できます。
- メジャーを参照することはできません。
- 入れ子になった CALCULATE 関数を使用することはできません。
Power BI Desktop の 2021 年 9 月リリース以降は、次も適用されます。
- 集計関数に引数として渡されない限り、テーブルをスキャンまたは返す関数は使用できません。
- スカラー値を返す集計関数 含めることができる
。 例えば 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 モードでは使用できません。
例
次の Sales テーブルメジャー定義は、青色の製品に対してのみ収益の結果を生成します。
この記事の例は、Adventure Works DW 2020 Power BI Desktop モデルのサンプルと共に使用できます。 モデルを取得するには、サンプル モデル
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 テーブルメジャー定義では、すべての販売チャネルの売上に対する売上の比率が生成されます。
チャンネル | 売上金額 | 収益 % 合計チャネル数 |
---|---|---|
インターネット | $29,358,677.22 | 26.74% |
リセラー | $80,450,596.98 | 73.26% |
Total | $109,809,274.20 | 100.00% |
Revenue % Total Channel =
DIVIDE(
SUM(Sales[Sales Amount]),
CALCULATE(
SUM(Sales[Sales Amount]),
REMOVEFILTERS('Sales Order'[Channel])
)
)
DIVIDE 関数は、Sales テーブルの合計 Sales Amount 列の値を (フィルター コンテキスト内で) 変更されたフィルター コンテキスト内の同じ式で除算します。 フィルター修飾子関数である REMOVEFILTERS 関数を使用してフィルター コンテキストを変更する CALCULATE 関数です。 チャネル 列の
次の Customer テーブルの計算列定義は、顧客をロイヤルティ クラスに分類します。 これは非常に単純なシナリオです。顧客によって生成された収益が $2500 未満の場合、
Customer Segment =
IF(
CALCULATE(SUM(Sales[Sales Amount]), ALLEXCEPT(Customer, Customer[CustomerKey])) < 2500,
"Low",
"High"
)
この例では、行コンテキストがフィルター コンテキストに変換されます。 コンテキスト遷移と呼ばれます。 ALLEXCEPT 関数は、CustomerKey 列を除くすべての Customer テーブル列からフィルターを削除します。