为什么 CALCULATE 与 FILTER 一起使用时不修改过滤器上下文?

Bal*_*ala 3 dax powerbi

我有一个有 2 个度量的表 - One and Two。两者都使用 CALCULATE 并具有过滤器。还有切片机。虽然Two正确地忽略了切片器的过滤器上下文,One但事实并非如此。

“年”[年] 是一个整数。

One = CALCULATE(SUM(Years[Sales Amount]),FILTER(Years, 'Years'[Year] = 2010))

Two = CALCULATE(SUM(Years[Sales Amount]),'Years'[Year] = 2010)

我(在学习中)缺少什么?我了解 Microsoft 建议不要使用 FILTER 作为过滤器参数。我只是想掌握它的工作方式。

在此输入图像描述

Fer*_*osa 10

有一些棘手的细节CALCULATE会产生不同的结果。I\xe2\x80\x99 将显示差异并在下面提供示例。

\n
\n

措施一

\n
One = CALCULATE(SUM(Years[Sales Amount]),FILTER(Years, \'Years\'[Year] = 2010))\n
Run Code Online (Sandbox Code Playgroud)\n

首先,请记住每种语言都是从最内部的函数到最外部的函数进行计算。

\n

这意味着Power BI将首先计算该函数FILTER,该函数将返回一个仅包含2010年的表。只有在此之后Power BI才会执行CALCULATE

\n

这里有一个棘手的部分:如果第二个参数中有一个过滤器,则CALCULATE可以忽略切片器(有关措施二的更多详细信息)。然而,第二个参数没有过滤器,只有一个表!(之前计算过,现在只包含2010年)。

\n

由于没有筛选器,因此CALCULATE应用上下文筛选器(示例中的切片器),排除 2013 年之前的任何内容。\n鉴于此,没有行与“措施一”的筛选器匹配,结果将为空(如果切片器设置为 2013-2018 年) , 当然)。

\n
\n

第二步

\n
Two = CALCULATE(SUM(Years[Sales Amount]),\'Years\'[Year] = 2010)\n
Run Code Online (Sandbox Code Playgroud)\n

第二个度量确实有一个过滤表达式:\'Years\'[Year] = 2010

\n

当提供过滤器表达式时,该CALCULATE函数会更改过滤器上下文(其中包含切片器或页面上的过滤器等)以评估表达式。

\n

对于每个过滤器表达式,有两种可能的结果CALCULATE

\n

结果 A.如果列已在筛选器上下文中,则现有筛选器将被表达式中的参数覆盖CALCULATE即,切片器(或此页面所有页面上的过滤器\xe2\x80\xa6)并不重要

\n

这就是你的第二个措施的情况!

\n

由于您在表达式和切片器中都使用了“Years”[Year] CALCULATE ,因此上下文过滤器将被CALCULATE表达式中的过滤器覆盖。我的意思是,结果是忽略切片器/过滤器上下文,您会发现结果为“3”。

\n

结果 B。如果列不在筛选器上下文中,则新筛选器将添加到筛选器上下文中以计算表达式。换句话说,它将同时考虑切片器/过滤器上下文和CALCULATE.

\n

为了举例说明这种行为,我创建了一个新措施:

\n
ThreeSalesFilter = CALCULATE(SUM(Years[Sales Amount]), \'Years\'[Sales Amount]=3)\n
Run Code Online (Sandbox Code Playgroud)\n

它与第二小节保持完全相同的行,对吗?Year=2010 是同一行 Sales Amount=3。\n但是,此度量的结果是空白,而不是 3。相当有趣!

\n

同样,发生这种情况是因为CALCULATE正在使用 \'Years\'[Sales Amount] 但切片器/过滤器上下文正在使用 \'Years\'[Year] \xe2\x80\x93 另一列。因此CALCULATE过滤器“加入”过滤器上下文;不要覆盖它。

\n
\n

下面是仪表板的再现,包括我的第三个变量。

\n

仪表板再现

\n

如果您需要更多详细信息或说明,请在评论中告诉我,我将在此处进行编辑。

\n