DAX FILTER中使用表(Date)与列(Date[Date])的差异解析
DAX公式筛选逻辑解答
背景说明
模型为星型模型,包含Date、Product、Sales表,Date和Product作为维度表筛选Sales表。现有两个DAX公式:
公式1:筛选ALL Date列
CALCULATE ( SUM ( Movements[Quantity] ), FILTER ( ALL ( 'Date'[Date] ), 'Date'[Date] < DATE ( 2013, 1, 1) ) )
公式2:筛选ALL Date表
CALCULATE ( SUM ( Movements[Quantity] ), FILTER ( ALL ( 'Date' ), 'Date'[Date] < DATE ( 2013, 1, 1) ) )
以下针对三个问题逐一解答:
问题1:上述公式使用的是筛选后的还是未筛选的Date表?
两个公式均使用未筛选的Date表数据生成筛选条件。ALL函数的作用是清除指定对象(列/表)的现有筛选上下文,不管报表中切片器或维度表本身的筛选是什么,都会重置对应部分的筛选状态,基于全量数据进行FILTER的条件判断。
问题2:Date表是否会被公式生成的筛选上下文完全替换?
分两种情况:
- 对于公式1(
ALL('Date'[Date])):不会完全替换。该公式仅清除Date[Date]列的现有筛选,Date表其他列(如Year、Month等)的原有筛选会保留。最终的筛选上下文是:新生成的Date[Date]<2013-01-01列筛选,加上Date表其他列的原有筛选。 - 对于公式2(
ALL('Date')):会完全替换。该公式清除了整个Date表的所有现有筛选,FILTER生成的Date[Date]<2013-01-01表级筛选会覆盖Date表的全部筛选上下文,原有Date表的任何筛选都不再生效。
问题3:在FILTER中使用表与列的区别是什么(即Date vs Date[Date])?
核心区别在于筛选清除的范围和最终生成的筛选类型:
- 使用
ALL('Date'):- 清除整个Date表的所有筛选上下文,FILTER遍历Date表的全量行(无任何筛选限制)。
- 最终生成表级筛选,直接覆盖Date表的所有筛选逻辑,原有Date表的筛选全部失效。
- 使用
ALL('Date'[Date]):- 仅清除
Date[Date]列的筛选上下文,FILTER仅针对该列的全量唯一值进行筛选。 - 最终生成列级筛选,Date表其他列的原有筛选仍然有效,会和新的列筛选共同作用于模型。
- 仅清除
内容的提问来源于stack exchange,提问作者variable
相关产品推荐
相关产品推荐

