你遇到的问题与RANKX无关,而是与所谓的“隐式度量”有关 - 这是Power BI和Power Pivot中不幸常见的糟糕做法。
在Power BI中,数字字段可以发挥两个作用:
它们可以成为DAX度量(例如SUM()等的输入)
或者它们可以是过滤器(即,在可视化中起与“子类别”相同的作用)。
当你将“My Value”放入一个没有任何计算的表格中(“不要汇总”),你告诉Power BI你想让“My Value”作为一个过滤器。在Excel数据透视表中,这相当于将“My Value”放入“行”区域,而不是“值”区域。因此,你的每一行表格现在都是由“子类别+My Value”分组的,而不仅仅是“子类别”(换句话说,你已经让“My Value”成为了你的过滤器上下文的一部分)。由于“子类别+My Value”的每个组合都是唯一的,所以你基本上是在对由1条记录组成的表进行排名(这就是为什么它总是返回1)。
当你选择“SUM”作为“My Value”时,它不再是一个行过滤器 - 它现在是一个度量。所以你的过滤器上下文现在不是“子类别+My Value”,而只是“子类别”,你的RANKX公式就可以正常工作了。你可以通过从表格中移除加总的“My Value”来轻松地看到这一点 - RANKX度量仍将按照相同的方式工作。
当你使用此“SUM”聚合来处理“My Value”时,你告诉Power BI隐式地为你创建一个DAX度量(这就是为什么它被称为“隐式度量”)。每当你直接将数字字段放入一个可视化中时,它就会发生。这些隐式度量在经验丰富的设计师中被认为是一种不好的做法,原因有很多,例如:
它很容易让人感到困惑(你对RANKX的困扰就是一个典型的例子);
你不能重复使用隐式度量(不能在其他DAX度量中引用它们)。
解决方案是:
永远不要直接将数字字段放入可视化中。
相反,始终编写一个DAX度量,然后将其放入可视化中。
在你的例子中,我会创建一个明确的DAX度量:
Total Value = SUM(RankDemo[My Value])
现在你可以在模型的各个地方使用它。你可以将它放入可视化中查看“我的价值”的总和。或者你可以在你的RANKX度量值中使用它:
Rank = RANKX( ALL(RankDemo[Sub Category]), [Total Value])
这种设计的好处有:
- 没有隐藏效果(您完全了解 [总价值] 的作用)
- 您可以在许多其他公式中使用 [总价值],无需一遍又一遍地编写汇总。
- 如果您在 [总价值] 中更改 DAX(例如,添加舍入),它将自动更新所有其他使用它的公式。
- 重复使用 DAX 度量使公式更加清晰、易于理解。