为何未使用CALCULATE时,MAXX不会将行上下文转为筛选上下文?
MAXX未使用CALCULATE时不转换行上下文为筛选上下文的原因
先看第一个DAX表达式:
MAXX(CUSTOMER, SUMX(SALES,SALES[AMT]+0))
该表达式执行SUMX时,不会将当前迭代的客户信息纳入筛选上下文,最终计算的是所有SALES记录中SALES[AMT]+0的总和,MAXX迭代每个客户时SUMX都返回同一个全局总和,最终结果即为该值。
而加入CALCULATE的表达式则能实现按客户筛选求和的效果:
MAXX(CUSTOMER, CALCULATE(SUMX(SALES,SALES[AMT]+0)))
核心原因:行上下文与筛选上下文的本质差异
- MAXX是迭代函数,遍历
CUSTOMER表每一行时会创建行上下文,这个上下文仅标记当前迭代到的客户行,但不会自动转化为筛选上下文。 - SUMX作为嵌套迭代函数,默认只会在自身迭代范围(整个SALES表)内计算,无法感知外部MAXX创建的行上下文——行上下文是“私有”的,只有通过CALCULATE这类具备上下文转换能力的函数,才能将行上下文转化为筛选上下文,让后续计算(比如SUMX)识别到当前客户的筛选条件。
- CALCULATE的核心功能之一就是上下文转换:它会自动把当前存在的所有行上下文转化为对应的筛选上下文,这样SUMX计算时就只会对与当前迭代客户关联的SALES记录求和,实现按客户分组计算的效果。
内容的提问来源于stack exchange,提问作者variable
相关产品推荐
相关产品推荐

