KEEPFILTERS

计算 CALCULATE 或 CALCULATETABLE 函数时,修改应用筛选器的方式。

语法

KEEPFILTERS(<expression>)  

parameters

术语 定义
表达式 任何表达式。

返回值

值表。

备注

  • 可以在上下文 CALCULATE 和 CALCULATETABLE 函数中使用 KEEPFILTERS,以替代这些函数的标准行为。

  • 默认情况下,函数(例如 CALCULATE)中的筛选器参数用作用于计算表达式的上下文,因此 CALCULATE 的筛选器参数会替换同一列上的所有现有筛选器。 受 CALCULATE 的筛选器参数影响的新上下文只影响作为筛选器参数一部分提及的列上的现有筛选器。 除 CALCULATE 或其他相关函数的参数中提到的列以外,其他列上的筛选器仍然有效且未被更改。

  • 可使用 KEEPFILTERS 函数修改此行为。 使用 KEEPFILTERS 时,当前上下文中的任何现有筛选器都将与筛选器参数中的列进行比较,且这些参数的交集将用作计算表达式的上下文。 对任何一列的最终影响是,这两组参数都适用:CALCULATE 中使用的筛选器参数和 KEEPFILTER 函数的参数中的筛选器。 换言之,尽管 CALCULATE 筛选器替换了当前上下文,但 KEEPFILTERS 将筛选器添加到了当前上下文。

  • 在已计算的列或行级安全性 (RLS) 规则中使用时,不支持在 DirectQuery 模式下使用此函数。

示例

下例将带你完成一些常见的场景,这些场景演示了如何将 KEEPFILTERS 函数用作 CALCULATE 或 CALCULATETABLE 公式的一部分。

前三个表达式获得了用于比较的简单数据:

  • 华盛顿州的 Internet 销售额。

  • 华盛顿州和俄勒冈州的 Internet 销售额(两州之和)。

  • 华盛顿州和不列颠哥伦比亚省的 Internet 销售额(两地区之和)。

第四个表达式计算华盛顿州和俄勒冈州的 Internet 销售额,同时应用华盛顿和不列颠哥伦比亚省的筛选器。

下一个表达式计算华盛顿州和俄勒冈州的 Internet 销售额,但使用 KEEPFILTERS;华盛顿和不列颠哥伦比亚省的筛选器是先前上下文的一部分。

EVALUATE ROW(  
  "$$ in WA"  
    , CALCULATE('Internet Sales'[Internet Total Sales]  
                , 'Geography'[State Province Code]="WA"  
      )  
, "$$ in WA and OR"  
    , CALCULATE('Internet Sales'[Internet Total Sales]  
               , 'Geography'[State Province Code]="WA"   
                 || 'Geography'[State Province Code]="OR"  
      )  
, "$$ in WA and BC"  
    , CALCULATE('Internet Sales'[Internet Total Sales]  
               , 'Geography'[State Province Code]="WA"   
                 || 'Geography'[State Province Code]="BC"  
      )  
, "$$ in WA and OR ??"  
    , CALCULATE(  
          CALCULATE('Internet Sales'[Internet Total Sales]  
                    ,'Geography'[State Province Code]="WA"   
                      || 'Geography'[State Province Code]="OR"  
          )  
          , 'Geography'[State Province Code]="WA"   
            || 'Geography'[State Province Code]="BC"  
      )  
, "$$ in WA !!"  
    , CALCULATE(  
          CALCULATE('Internet Sales'[Internet Total Sales]  
                   , KEEPFILTERS('Geography'[State Province Code]="WA"   
                              || 'Geography'[State Province Code]="OR"  
                     )  
          )  
          , 'Geography'[State Province Code]="WA"   
            || 'Geography'[State Province Code]="BC"  
      )  
)  

当根据示例数据库 AdventureWorks DW 计算此表达式时,将获得以下结果。

[$$ in WA] $ 2,467,248.34
[$$ in WA and OR] $ 3,638,239.88
[$$ in WA and BC] $ 4,422,588.44
[$$ in WA and OR ??] $ 3,638,239.88
[$$ in WA !!] $ 2,467,248.34

注意

出于指导目的,将以上结果的格式设置为表而不是单行。

首先,查看表达式 [$$ in WA and OR ??] 。 由于外部 CALCULATE 表达式包含华盛顿和不列颠哥伦比亚省的筛选器,你可能想知道该公式如何能够返回华盛顿州和俄勒冈州的销售值。 这是因为 CALCULATE 的默认行为会替代 'Geography'[State Province Code] 中的外部筛选器,并替换其自己的筛选器参数,因为筛选器适用于同一列。

接下来,查看表达式 [$$ in WA !!] 。 由于参数筛选器包括俄勒冈州,同时外部 CALCULATE 表达式又包括华盛顿州和不列颠哥伦比亚省的筛选器,此时你可能想知道该公式如何能够仅返回华盛顿州的销售值。 这是因为 KEEPFILTERS 修改了 CALCULATE 的默认行为,并添加了其他筛选器。 由于使用了筛选器的交集,因此现在将外部筛选器 'Geography'[State Province Code]="WA" || 'Geography'[State Province Code]="BC") 添加到了筛选器参数 'Geography'[State Province Code]="WA" || 'Geography'[State Province Code]="OR" 。 由于这两个筛选器都适用于同一列,因此结果筛选器 'Geography'[State Province Code]="WA" 是在计算表达式时所应用的筛选器。

筛选器函数
CALCULATE 函数
CALCULATETABLE 函数