コンテキストの変換を実行する

完了

行コンテキスト内でメジャーまたはメジャー式が評価されるとどうなるでしょうか。 このシナリオは、計算列の数式で、または反復子関数の式が評価されるときに生じることがあります。

次の例では、Customer (顧客) テーブルに計算列を追加し、顧客をロイヤルティ クラスに分類します。 シナリオは単純です。顧客が生み出した収益が 2500 米国ドル未満の場合、顧客は Low (低) と分類されます。それ以外の場合は High (高) と分類されます。

Customer Segment =
VAR CustomerRevenue = SUM(Sales[Sales Amount])
RETURN
    IF(CustomerRevenue < 2500, "Low", "High")

レポートの [ページ 4] で、円グラフの凡例として Customer Segment (顧客セグメント) 列を追加します。

画像は、

1 つの Customer Segment (顧客セグメント) 値のみが存在することに注目してください。 その理由は、計算列の数式によって誤った結果が生成されるためです。式 SUM(Sales[Sales Amount]) はフィルター コンテキストで評価されないため、各顧客には High (高) の値が割り当てられます。 その結果、各顧客は、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
        )
    )
)

これで、テーブルの視覚エフェクトに、すべての地域の販売手数料の合計が表示されるようになりました。

画像は、3 つの列があるテーブルの視覚エフェクトを示しています (Region (地域)、Revenue (収益)、Sales Commission (販売手数料))。10 地域の行と合計が表示されています。Sales Commission (販売手数料) の合計に合計が表示されるようになりました。