执行上下文转换

已完成

在行上下文中对度量值或度量值表达式求值时会发生什么情况? 在计算列公式中,或者在迭代器函数中的表达式被求值时,可能会出现以下场景。

在下面的示例中,将向 Customer 表添加一个计算列,以将客户按忠诚度分类。 场景很简单:当客户产生的收入低于 2500 美元时,该客户将归类为,否则归类为

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

在报表的第 4 页上,将 Customer Segment 列添加为饼图图例。

图像显示了一个标题为“Revenue (按 Customer Segment)”的饼图视觉对象。其中只有一个客户细分:“高”,占数据的 100%。

请注意,仅存在一个 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")

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

图像显示了一个标题为“Revenue (按 Customer Segment)”饼图视觉对象。其中有两个客户细分:“高”和“低”。“高”占数据的 76%,“低”占数据的 24%。

在本例中,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
        )
    )
)

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

图像显示了一个表视觉对象,其中包括三列:“Region”、“Region”和“Sales Commission”,并显示了十个区域行和一个总计。“Sales Commission”现在已生成总计。