DAX使用ALL()函数后仍存在年份筛选上下文的原因咨询
问题现象
ALL函数移除筛选上下文的操作未生效,度量值返回结果不符合预期。
已定义dim_CALENDAR日期维度表,表结构如下:
异常度量值
编写的度量值代码如下,预期是所有行统一返回全表最大日期对应的YEAR_DAY值10:
VAR lt_MAX_DATE = FILTER( ALL( dim_CALENDAR[DATE] ), dim_CALENDAR[DATE] = MAX( dim_CALENDAR[DATE] ) ) VAR lv_MAX_YEAR_DAY = CALCULATE( VALUES( dim_CALENDAR[YEAR_DAY] ), ALL( dim_CALENDAR ), lt_MAX_DATE ) RETURN lv_MAX_YEAR_DAY
实际运行结果
度量值实际运行效果如下,Max Date ALL列按行返回了各年份对应最大日期的YEAR_DAY值,没有返回预期的全局统一值10:
问题根因
出现这个问题的核心原因是DAX变量的计算时机:
- VAR定义的变量会在变量声明位置的当前筛选上下文中完成计算,计算结果是静态值,不会被后续CALCULATE内部的筛选调整影响。
- 你在CALCULATE外部声明
lt_MAX_DATE时,MAX(dim_CALENDAR[DATE])是在视觉对象按年份拆分的行筛选上下文中计算的:2023行计算得到的是2023年的最大日期,2024行计算得到的是2024年的最大日期,FILTER返回的是仅包含当前行对应年份最大日期的单值表。 - 后续CALCULATE执行时,确实通过
ALL(dim_CALENDAR)清除了维度表上的所有现有筛选,但紧接着又把提前计算好的、带年份限定的lt_MAX_DATE表作为筛选条件应用,相当于又把对应年份的筛选加了回去,自然无法返回全局最大日期对应的结果。
修正方案
将全局最大日期的计算逻辑放到CALCULATE内部,避免变量提前被外部筛选上下文污染,修正后代码如下:
VAR lv_MAX_YEAR_DAY = CALCULATE( VALUES( dim_CALENDAR[YEAR_DAY] ), ALL( dim_CALENDAR ), dim_CALENDAR[DATE] = MAX( ALL( dim_CALENDAR[DATE] ) ) ) RETURN lv_MAX_YEAR_DAY
内容的提问来源于stack exchange,提问作者Frederi ROSE
相关产品推荐
相关产品推荐

