执行上下文转换
在行上下文中对度量值或度量值表达式求值时会发生什么情况? 在计算列公式中,或者在迭代器函数中的表达式被求值时,可能会出现以下场景。
在下面的示例中,将向 Customer 表添加一个计算列,以将客户按忠诚度分类。 场景很简单:当客户产生的收入低于 2500 美元时,该客户将归类为低,否则归类为高。
Customer Segment =
VAR CustomerRevenue = SUM(Sales[Sales Amount])
RETURN
IF(CustomerRevenue < 2500, "Low", "High")
在报表的第 4 页上,将 Customer Segment 列添加为饼图图例。
请注意,仅存在一个 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")
在饼图视觉对象中将新的计算列添加到图例,验证现在是否显示两个饼图客户细分。
在本例中,CALCULATE
函数应用行上下文值作为筛选器,这称为上下文转换。 准确地说,当表中仅有一列时,该过程不会完全按上述方式进行。 当表中仅有一列时,只需对该列应用筛选器即可进行转换。 在本例中,Power BI 对 CustomerKey 列应用了行上下文值作为筛选器。
如果您针对在行上下文中求值的表达式引用度量值,系统将自动进行上下文转换。 因此,不需要将度量值引用传递给 CALCULATE
函数。
修改引用 Revenue 度量值的计算列定义,注意它将继续生成正确的结果。
Customer Segment =
VAR CustomerRevenue = [Revenue]
RETURN
IF(CustomerRevenue < 2500, "Low", "High")
现在,可以完成 Sales Commission 度量值公式。 要生成总计,需要使用迭代器函数遍历筛选器上下文中的所有区域。 迭代器函数表达式必须使用 CALCULATE
函数将行上下文转换为筛选器上下文。 请注意,由于函数按单个国家/地区进行筛选(它遍历筛选器上下文中的区域,而一个区域仅属于一个国家/地区),因此不需要再测试 Sales Territory 表中的单个 Country 列值是否位于筛选器上下文中。
切换到报表的第 3 页,然后将 Sales Commission 度量值定义修改为使用 SUMX
迭代器函数:
Sales Commission =
SUMX(
VALUES('Sales Territory'[Region]),
CALCULATE(
[Revenue]
* IF(
VALUES('Sales Territory'[Country]) = "United States",
0.15,
0.1
)
)
)
现在,表视觉对象显示所有区域的销售佣金总计。