DAX中计算度量值最大值的问题求助
DAX 问题排查与解决方案
问题原因分析
原公式失效原因
MAXX(ALL(EventDetail[TimelinessBreak]),[RunningTotal*])仅清除了TimelinessBreak列的筛选,但RunningTotal*度量值中使用的ALLSELECTED('EventDetail')会保留当前可视化的其他筛选上下文(如切片器、其他列筛选)。此时MAXX遍历TimelinessBreak所有值时,每个值对应的RunningTotal*是当前筛选上下文+清除TimelinessBreak筛选后的结果,并非当前可视化中RunningTotal*的全局最大值。Marcus公式返回错误值原因
CALCULATE([RunningTotal*], ALL(EventDetail))清除了EventDetail表的所有筛选,导致RunningTotal*中的ALLSELECTED('EventDetail')等效于ALL(EventDetail),计算的是全表所有行的累计总和(3587177),而非当前可视化范围内的目标最大值1982。
解决方案
方案一:遍历当前可视化所有分组取最大值
Pareto%* = MAXX( // 获取当前可视化中所有TimelinessBreak分组(保留其他筛选) CALCULATETABLE( VALUES(EventDetail[TimelinessBreak]), ALLSELECTED(EventDetail) ), // 计算每个分组对应的RunningTotal* CALCULATE( [RunningTotal*], EventDetail[TimelinessBreak] = EARLIER(EventDetail[TimelinessBreak]) ) )
方案二:直接取排序最后一个分组的累计值(更高效)
由于RunningTotal*是按TimelinessBreakSort降序累计的,最大值必然是排序最后一个分组的累计值,可直接定位计算:
Pareto%* = CALCULATE( [RunningTotal*], FILTER( ALLSELECTED(EventDetail[TimelinessBreakSort], EventDetail[TimelinessBreak]), EventDetail[TimelinessBreakSort] = MAX(ALLSELECTED(EventDetail[TimelinessBreakSort])) ) )
验证逻辑
两个方案均保留了当前可视化的筛选上下文(与你移除TimelinessBreak列时的筛选一致),确保计算的是当前范围内RunningTotal*的最大值1982,且每行都返回该值。
内容的提问来源于stack exchange,提问作者Red Devil
相关产品推荐
相关产品推荐

