RANKX使用报错“无法确定Table1表GrossMargeEUR列单值”如何解决?
报错原因
你触发的是DAX度量值的典型上下文错误:度量值默认不存在行上下文,你在度量值的RANKX函数里直接引用GrossMargeEUR列时,DAX无法判断你需要调用当前行的该列值,还是全表该列的聚合结果,因此抛出「无法确定单值」的报错,和该列有没有缺失值无关。
解决方案
根据你的使用场景,可以选择两种实现方式:
方案1:计算列实现(静态存储在表中,适合不需要动态筛选的场景)
计算列本身自带行上下文,直接引用列名不会触发报错,操作步骤如下:
- 新建排名计算列,输入DAX代码:
GrossMargeRank = RANKX('Table1', 'Table1'[GrossMargeEUR], , DESC, Dense)
- 新建累计求和计算列,输入DAX代码:
CumulativeGrossMargeEUR = CALCULATE( SUM('Table1'[GrossMargeEUR]), FILTER('Table1', 'Table1'[GrossMargeRank] <= EARLIER('Table1'[GrossMargeRank])) )
上述代码中EARLIER函数会获取当前行的排名值,筛选出所有排名小于等于当前排名的行做求和,实现从大到小累计的效果。
方案2:度量值实现(适配切片器等动态筛选场景,累计值随筛选条件自动更新)
度量值必须先对列做聚合才能调用,操作步骤如下:
- 新建基础聚合度量值:
TotalGrossMarge = SUM('Table1'[GrossMargeEUR])
- 新建排名度量值:
GrossMargeRank_Measure = RANKX(ALLSELECTED('Table1'), [TotalGrossMarge], , DESC, Dense)
- 新建累计求和度量值:
CumulativeGrossMarge_Measure = CALCULATE( [TotalGrossMarge], FILTER(ALLSELECTED('Table1'), [GrossMargeRank_Measure] <= MAX('Table1'[GrossMargeRank])) )
如果需要按产品、区域等维度分组累计,只需把ALLSELECTED('Table1')替换为对应的维度列即可,比如ALLSELECTED('Table1'[ProductName])就可以实现按产品维度的分组累计。
内容的提问来源于stack exchange,提问作者Herr San
相关产品推荐
相关产品推荐

