DAX,PowerBI中的RANKX()问题

Ian*_*Jay 3 dax powerbi

我正在学习DAX,并对PowerBI中的RANKX()感到困惑。这是我的数据:

在此处输入图片说明

这是我的措施:

Rank = RANKX(
    ALL(RankDemo[Sub Category]),
    CALCULATE(SUM(RankDemo[My Value])))
Run Code Online (Sandbox Code Playgroud)

这是我的视觉效果:

在此处输入图片说明

RANKX()可以正常工作,但是必须在PowerBI字段设置中将字段[My Value] 求和在此处输入图片说明在此处输入图片说明

如果我选择不汇总,排名将全部为1。有人可以解释吗?Sum与DAX中的RANKX()或CALCULATE()有什么关系。谢谢。

RAD*_*ADO 6

您遇到的问题与RANKX无关。问题出在所谓的“隐式度量”上-这是Power BI和Power Pivot中的一种(不幸的)常见的坏习惯。

Power BI中的数字字段可以充当2个角色:

  • 它们可以输入到DAX度量中(例如SUM()等)
  • 或者它们可以是过滤器(即,与视觉中的“子类别”具有相同的功能)。

当您将“我的值”放到没有任何计算的表中(“不汇总”)时,您在告诉Power BI您希望“我的值”充当过滤器。在Excel数据透视表中,它等同于将“我的值”放到“行”区域而不是“值”中。因此,表中的每一行现在都按“子类别+我的价值”分组,而不仅仅是“子类别”(换句话说,您已经将“我的价值” ”)。由于“子类别+我的值”的每种组合都是唯一的,因此您实际上是在对包含1条记录的表进行排名(这就是为什么它总是返回1)的原因。

当您为“我的价值”选择“总和”时,它不再是行过滤器-现在是一种度量。因此,您现在筛选上下文不是“子类别” +“我的值”,而是“子类别”,并且RANKX公式可以正常工作。您可以通过从表格中删除汇总的“我的价值”来轻松地看到这一点-RANKX度量仍将以相同的方式工作。

当您将此“ SUM”聚合用于“我的价值”时,就是在告诉Power BI隐式为您创建DAX度量(这就是为什么将其称为“隐式度量”)。每当将数字字段直接放入视觉对象时,都会发生这种情况。出于多种原因,这种有隐含的措施被认为是经验丰富的设计师的不良做法,例如:

  • 令人困惑(您使用RANKX的麻烦就是一个典型的例子);
  • 您不能重复使用隐式度量(不能在其他DAX度量中引用它们)。

一个解决方案是:

  • 绝对不要将数字字段直接放入视觉效果。
  • 相反,请始终编写DAX度量,然后将其放入视觉对象中。

在您的示例中,我将创建一个显式的DAX度量:

Total Value = SUM(RankDemo[My Value])
Run Code Online (Sandbox Code Playgroud)

现在,您可以在模型中的任何地方使用它。您可以将其放到视觉效果中查看“我的价值”总和。或者您可以在RANKX度量中使用它:

Rank = RANKX( ALL(RankDemo[Sub Category]), [Total Value])
Run Code Online (Sandbox Code Playgroud)

这种设计的好处是:

  • 无隐藏效果(您确切知道[总价值]的作用)
  • 您可以在许多其他公式中使用[Total Value],而无需一次又一次地求和。
  • 如果在[Total Value]中更改DAX(例如,添加舍入),它将自动更新使用它的所有其他公式。
  • 重复使用DAX度量值可使公式更整洁,更易于理解。