执行上下文转换
如果在行上下文中计算度量值或度量值表达式,会发生什么情况? 在计算列公式中或在计算迭代器函数中的表达式时,可能会出现这种情况。
在下面的示例中,将在“Customer”表中添加一个计算列,用于将客户划分为忠诚度类。 这种情况很简单:当客户生产的收入小于 2500 美元时,客户将归类为“低”;否则,它们将归类为“高”。
Customer Segment =
VAR CustomerRevenue = SUM(Sales[Sales Amount])
RETURN
IF(CustomerRevenue < 2500, "Low", "High")
在报表第 4 页,将“客户细分”列添加为饼图图例。
请注意,仅存在一个“客户细分”值。 原因在于,计算列公式产生了错误结果:每个客户都分配了“高”值,因为不会在筛选器上下文中计算表达式 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")
在饼图视觉对象中,将新的计算列添加到图例井中,验证两个饼图段现在是否显示。
在这种情况下,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
)
)
)
现在,表视觉对象显示所有区域的销售佣金总额。