DAX,PowerBI中的RANKX()问题

时间:2019-03-19 01:42:42

标签: powerbi dax

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

enter image description here

这是我的措施:

Rank = RANKX(
    ALL(RankDemo[Sub Category]),
    CALCULATE(SUM(RankDemo[My Value])))

这是我的视觉:

enter image description here

RANKX()可以正常工作,但是必须在PowerBI字段设置中对[My Value]字段进行求和enter image description here enter image description here

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

1 个答案:

答案 0 :(得分:5)

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

Power BI中的数字字段可以担当两个角色:

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

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

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

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

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

解决方案是:

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

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

Total Value = SUM(RankDemo[My Value])

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

Rank = RANKX( ALL(RankDemo[Sub Category]), [Total Value])

这种设计的好处是:

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