执行上下文转换

已完成

如果在行上下文中计算度量值或度量值表达式,会发生什么情况? 在计算列公式中或在计算迭代器函数中的表达式时,可能会出现这种情况。

在下面的示例中,将在“Customer”表中添加一个计算列,用于将客户划分为忠诚度类。 这种情况很简单:当客户生产的收入小于 2500 美元时,客户将归类为“低”;否则,它们将归类为“高”。

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

在报表第 4 页,将“客户细分”列添加为饼图图例。

图像显示标题为“按客户细分的收入“视觉对象。只有一个客户细分:“高”,表示 100% 数据。

请注意,仅存在一个“客户细分”值。 原因在于,计算列公式产生了错误结果:每个客户都分配了“高”值,因为不会在筛选器上下文中计算表达式 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")

在饼图视觉对象中,将新的计算列添加到图例井中,验证两个饼图段现在是否显示。

图像显示标题为“按客户细分的收入“视觉对象。有两个客户细分:“高”和“低”。“高“表示 76% 的数据,“低”表示 24%。

在这种情况下,CALCULATE 函数将行上下文值应用为筛选器,称为“上下文转换”。 准确地说,当表上有唯一列时,这个过程并不完全是这样工作的。 当表中有唯一列时,只需对该列应用筛选器即可进行转换。 在这种情况下,Power BI 将“CustomerKey”列上的筛选器应用于行上下文中的值。

如果在行上下文中计算的表达式中引用度量值,则上下文转换将自动进行。 因此,不需要将度量值引用传递给 CALCULATE 函数。

修改引用“收入”度量值的计算列定义,注意它将继续生成正确的结果。

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

现在,可以完成“销售佣金”度量值公式。 若要生成总计,需要使用迭代器函数循环访问筛选器上下文中的所有区域。 迭代器函数表达式必须使用 CALCULATE 函数将行上下文转换为筛选器上下文。 请注意,它不再需要测试 Sales Territory 表中的单个 Country 列值是否位于筛选器上下文中,因为它被认为是根据单个国家/地区进行筛选(因为它在筛选器上下文中的区域上迭代,而一个区域仅属于一个国家/地区)。

切换到报表第 3 页,然后将“销售佣金”度量值定义修改为使用 SUMX 迭代器函数:

Sales Commission =
SUMX(
    VALUES('Sales Territory'[Region]),
    CALCULATE(
        [Revenue]
        * IF(
            VALUES('Sales Territory'[Country]) = "United States",
            0.15,
            0.1
        )
    )
)

现在,表视觉对象显示所有区域的销售佣金总额。

图像显示具有三个列的表视觉对象:“区域”、“收入”和“销售佣金”。显示十个区域行和总计。总销售佣金现有一个总额。