我正在学习DAX,并且对PowerBI中的RANKX()感到困惑。 这是我的数据:
这是我的措施:
Rank = RANKX(
ALL(RankDemo[Sub Category]),
CALCULATE(SUM(RankDemo[My Value])))
这是我的视觉:
RANKX()可以正常工作,但是必须在PowerBI字段设置中对[My Value]字段进行求和:
如果我选择不总结,那么排名将全部为1。有人可以解释吗? Sum与DAX中的RANKX()或CALCULATE()有什么关系。谢谢。
答案 0 :(得分:5)
您遇到的问题与RANKX无关。问题出在所谓的“隐式度量”上-这是Power BI和Power Pivot中的一种(不幸的)常见的坏习惯。
Power BI中的数字字段可以担当两个角色:
当您将“我的值”放到表中而没有任何计算(“不汇总”)时,您是在告诉Power BI您希望“我的值”充当过滤器。在Excel数据透视表中,它将等同于将“我的值”放到“行”区域而不是“值”中。因此,表中的每一行现在都按“子类别+我的值”进行分组,而不仅仅是“子类别”(换句话说,您已经“我的值”是过滤器上下文的一部分。由于“子类别+我的值”的每种组合都是唯一的,因此您实际上是对由1条记录组成的表进行排名(这就是为什么它总是返回1)的原因。
当您为“我的值”选择“总和”时,它不再是行过滤器-现在是一种度量。因此,您现在筛选上下文不是“子类别” +“我的值”,而是“子类别”,并且您的RANKX公式可以正常工作。您可以通过从表格中删除汇总的“我的价值”来轻松地看到这一点-RANKX度量仍将以相同的方式工作。
当将此“ SUM”聚合用于“我的价值”时,您是在告诉Power BI隐式为您创建DAX度量(这就是为什么将其称为“隐式度量”)。每当将数字字段直接放入视觉对象时,都会发生这种情况。出于多种原因,这种有隐含的措施被认为是经验丰富的设计师的不良做法,例如:
解决方案是:
在您的示例中,我将创建一个显式的DAX度量:
Total Value = SUM(RankDemo[My Value])
现在,您可以在模型中的任何地方使用它。您可以将其放到视觉效果中查看“我的价值”总和。或者您可以在RANKX度量中使用它:
Rank = RANKX( ALL(RankDemo[Sub Category]), [Total Value])
这种设计的好处是: