使用筛选器修饰符函数
使用 CALCULATE
函数时,可以传入筛选器修改函数,这允许你完成除添加筛选器以外的更多操作。
删除筛选器
使用 REMOVEFILTERS
DAX 函数作为 CALCULATE
筛选表达式,以便从筛选器上下文中删除筛选器。 它可以从一个或多个列或从单个表的所有列中删除筛选器。
注意
REMOVEFILTERS
函数相对较新。 在早期版本的 DAX 中,你使用 ALL
DAX 函数或变量(包括 ALLEXCEPT
和 ALLNOBLANKROW
DAX 函数)删除了筛选器。 这些函数同时作为筛选器修饰符和返回非重复值的表对象的函数。 之所以提到这些函数,是因为你可能会找到使用它们删除筛选器的文档和公式示例。
在下面的示例中,你将向 Sales 表添加一个新的度量值,该度量值计算“收入”度量值,但通过从“Sales Territory”表中删除筛选器来执行此操作。 将此度量值的格式设置为带有两个小数位数的货币。
Revenue Total Region = CALCULATE([Revenue], REMOVEFILTERS('Sales Territory'))
现在,将“收入占总区域收入的百分比”度量值添加到报表第 2 页中的矩阵视觉对象。 矩阵视觉对象将按行上的“销售区域”表中的三个列进行分组:“组”、“国家/地区”和“区域”。
请注意,每个“收入占总区域收入的百分比”值都相同。 这是总收入的值。
尽管此结果本身并没什么用,但当它作为比率中的分母使用时,它将计算总金额的百分比。 因此,现在将用以下定义覆盖“收入占总区域收入的百分比”度量值定义。 (此新定义更改度量值名称并声明两个变量。请确保将度量值的格式设置为带两个小数位数的百分比。)
Revenue % Total Region =
VAR CurrentRegionRevenue = [Revenue]
VAR TotalRegionRevenue =
CALCULATE(
[Revenue],
REMOVEFILTERS('Sales Territory')
)
RETURN
DIVIDE(
CurrentRegionRevenue,
TotalRegionRevenue
)
验证矩阵视觉对象是否显示“收入占总区域收入的百分比”值。
现在你将创建另一个度量值,但这次,你将计算某个区域的收入除以其所在国家/地区收入的比率。
在完成此任务之前,请注意,西南地区的“收入占总区域收入的百分比”值为 22.95%。 调查此单元格的筛选器上下文。 切换到数据视图,然后在“字段”窗格中,选择“Sales Territory”表。
应用以下列筛选器:
- 组 - 北美
- 国家/地区 - 美国
- 区域 -西南
请注意,筛选器会将表减少为仅占一行。 现在,在考虑新目标以创建区域收入占其国家/地区收入的比率时,请从“区域”列中清除筛选器。
请注意,现在有五行,每行都属于美国这个国家。 相应地,当你清除“区域”列筛选器,同时在“国家/地区”和“组”列上保留筛选器时,你将有一个适用于该区域国家/地区的新筛选器上下文。
在下面的度量值定义中,请注意如何清除或删除列中的筛选器。 在 DAX 逻辑中,这是对“收入占总区域收入的百分比”度量值公式的细微更改:现在,REMOVEFILTERS
函数将从 Region 列中删除筛选器,而不是从“Sales Territory”表的所有列中删除筛选器。
Revenue % Total Country =
VAR CurrentRegionRevenue = [Revenue]
VAR TotalCountryRevenue =
CALCULATE(
[Revenue],
REMOVEFILTERS('Sales Territory'[Region])
)
RETURN
DIVIDE(
CurrentRegionRevenue,
TotalCountryRevenue
)
向 Sales 表添加“收入占总国家/地区收入的百分比”度量值,然后将其设置为带有两个小数位数的百分比。 将新度量值添加到矩阵视觉对象。
请注意,除美国地区的值外,所有值都是 100%。 原因在于,在 Adventure Works 公司,美国具有区域,而所有其他国家/地区则没有。
注意
表格模型不支持不规则层次结构,它们是具有可变深度的层次结构。 因此,它是一种用于在层次结构的较低级别重复父(或其他上级)值的常见设计方法。 例如,澳大利亚没有区域,因此国家/地区值重复为区域名称。 存储有意义的值总是比空白值更好。
下一个示例是将创建的最后一个度量值。 添加“收入占总组收入的百分比”度量值,然后将其设置为带有两个小数位数的百分比。 然后,将新度量值添加到矩阵视觉对象。
Revenue % Total Group =
VAR CurrentRegionRevenue = [Revenue]
VAR TotalGroupRevenue =
CALCULATE(
[Revenue],
REMOVEFILTERS(
'Sales Territory'[Region],
'Sales Territory'[Country]
)
)
RETURN
DIVIDE(
CurrentRegionRevenue,
TotalGroupRevenue
)
当你从“Sales Territory”表中的 Region 和 Country 列中删除筛选器时,该度量值将计算该区域的收入与其所在组的收入之比。
保留筛选器
可以使用 KEEPFILTERS
DAX 函数作为 CALCULATE
函数中的筛选表达式来保留筛选器。
若要观察如何完成此任务,请切换到报表第 1 页。 然后,将“红色收入”度量值定义修改为使用 KEEPFILTERS
函数。
Revenue Red =
CALCULATE(
[Revenue],
KEEPFILTERS('Product'[Color] = "Red")
)
在表视觉对象中,请注意,只有一个“红色收入”值存在。 原因是因为布尔筛选表达式保留了 Product 表中 Color 列上的现有筛选器。 红色之外的颜色为空的原因是,筛选器上下文和筛选表达式是为这两个筛选器组合的。 黑色和红色是相交的,因为这两种情况不能同时为 TRUE
,因此该表达式的筛选依据不是产品行。 只有两个红色筛选器可以同时为 TRUE
,这就解释了显示一个“红色收入”值的原因。
使用非活动关系
在将 USERELATIONSHIP
DAX 函数作为筛选表达式传递到 CALCULATE
函数时,非活动模型关系只能传播筛选器。 使用此函数参与非活动关系时,活动关系将自动变为非活动状态。
查看使用非活动关系按发货日期计算“收入”度量值的度量值定义示例:
Revenue Shipped =
CALCULATE (
[Revenue],
USERELATIONSHIP('Date'[DateKey], Sales[ShipDateKey])
)
修改关系行为
在计算表达式时,可以修改模型关系行为,方法是将 CROSSFILTER
DAX 函数作为筛选表达式传递给 CALCULATE
函数。 这是一个高级功能。
CROSSFILTER
函数可以修改筛选器方向(从双向到单向,或从单向到双向),甚至可以禁用关系。