コンテキストの変換を実行する
行コンテキスト内でメジャーまたはメジャー式が評価されるとどうなるでしょうか。 このシナリオは、計算列の数式で、または反復子関数の式が評価されるときに生じることがあります。
次の例では、Customer テーブルに計算列を追加して、顧客をロイヤルティ クラスに分類しています。 シナリオはシンプルです。顧客が生み出す収益が 2,500 ドル未満の場合、その顧客は低に分類され、それ以外の場合は高に分類されます。
Customer Segment =
VAR CustomerRevenue = SUM(Sales[Sales Amount])
RETURN
IF(CustomerRevenue < 2500, "Low", "High")
レポートの ページ 4 で、円グラフの凡例として Customer Segment 列を追加します。
1 つの Customer Segment 値のみが存在することに注目してください。 その理由は、計算列の数式によって誤った結果が生成されるためです。式 SUM(Sales[Sales Amount])
がフィルター コンテキストで評価されないため、各顧客に値高が割り当てられます。 その結果、各顧客は、Sales テーブルのすべての Sales Amount 列の値の合計に基づいて評価されます。
"顧客ごとに" SUM(Sales[Sales Amount])
式の評価を強制するには、行コンテキスト列の値を適用してコンテキストをフィルター処理するコンテキストの変換を実行する必要があります。 フィルター式を渡さずに CALCULATE
関数を使用することにより、この変換を実現できます。
正しい結果が生成されるように、計算列の定義を変更します。
Customer Segment =
VAR CustomerRevenue = CALCULATE(SUM(Sales[Sales Amount]))
RETURN
IF(CustomerRevenue < 2500, "Low", "High")
円グラフ ビジュアルで、新しい計算列を凡例ウェルに追加し、2 つの円グラフのセグメントが表示されていることを確認します。
この場合、CALCULATE
関数は行コンテキスト値をフィルターとして適用します。これは、コンテキストの変換と呼ばれます。 正確には、一意の列がテーブルにある場合、プロセスはそのように動作しません。 一意の列がテーブルにある場合、その列にフィルターを適用するだけで変換を実行できます。 この場合、Power BI は行コンテキストの値に対して CustomerKey 列にフィルターを適用します。
行コンテキストで評価される式でメジャーを参照する場合、コンテキストの変換は自動的に行われます。 したがって、CALCULATE
関数にメジャー参照を渡す必要はありません。
Revenue メジャーを参照する計算列の定義を変更します。正しい結果が引き続き生成されることに注目してください。
Customer Segment =
VAR CustomerRevenue = [Revenue]
RETURN
IF(CustomerRevenue < 2500, "Low", "High")
これで、Sales Commission メジャー式は完成させることができます。 合計を生成するには、反復子関数を使用して、フィルター コンテキスト内のすべての地域を反復処理する必要があります。 反復子関数式では、行コンテキストをフィルター コンテキストに変換する CALCULATE
関数を使用する必要があります。 Sales Territory テーブルの 1 つの Country 列の値がフィルター コンテキスト内にあるかどうかをテストする必要がなくなったことに注目してください。これは、1 つの国でフィルター処理していることがわかっているからです (フィルター コンテキストで地域を反復処理し、地域は 1 つの国にのみ属しているからです)。
レポートのページ 3 に切り替え、SUMX
反復子関数を使用するように Sales Commission メジャー定義を変更します。
Sales Commission =
SUMX(
VALUES('Sales Territory'[Region]),
CALCULATE(
[Revenue]
* IF(
VALUES('Sales Territory'[Country]) = "United States",
0.15,
0.1
)
)
)
これで、テーブル ビジュアルに、すべての地域の売上歩合の合計が表示されるようになりました。