Power BI Desktop计算列与DAX Studio结果不一致问题咨询
Power BI计算列与DAX Studio结果不一致的原因及解决方法
问题现象
在DAX Studio中执行以下测试代码,能得到全表总和结果5(1+3+1):
-- parent - child rollup test -- 3 rows, 3 values, sumx EVALUATE DATATABLE ( "name", STRING, "child value", INTEGER, { { "test1", 1 }, { "test2", 3 }, { "test3", 1 } } ) EVALUATE VAR _rollup = SUMX ( CALCULATETABLE ( 'RollupTest' ), 'RollupTest'[child value] ) RETURN { _rollup }
但将相同逻辑作为计算列[rollup test]添加到Power BI Desktop的RollupTest表中时,并未为3行数据均返回5,而是每行返回对应行的child value值。
核心原因
问题出在行上下文的继承上:
- DAX Studio中的
EVALUATE语句是在无上下文环境中执行的,CALCULATETABLE('RollupTest')会返回整个表,因此SUMX计算的是全表数据的总和。 - Power BI的计算列是在行上下文中逐行执行的,
CALCULATETABLE默认会继承当前行的筛选上下文——也就是说,每行执行时,CALCULATETABLE('RollupTest')只会返回当前行的数据,因此SUMX最终计算的是单条记录的child value,而非全表总和。
解决方法
要让计算列忽略行上下文的筛选,获取全表的总和,需要用ALL('RollupTest')清除所有筛选条件,以下是几种可行的修改方案:
方法一(保留原有结构)
rollup test = VAR _rollup = SUMX ( CALCULATETABLE ( 'RollupTest', ALL('RollupTest') ), 'RollupTest'[child value] ) RETURN _rollup
方法二(简化SUMX写法)
rollup test = SUMX(ALL('RollupTest'), 'RollupTest'[child value])
方法三(更简洁的CALCULATE写法)
rollup test = CALCULATE(SUM('RollupTest'[child value]), ALL('RollupTest'))
以上三种写法都能让计算列每行返回全表总和5。
内容的提问来源于stack exchange,提问作者Gary Thomann
相关产品推荐
相关产品推荐

