为什么 DAX 中的这个 SUMX 函数与预期的不同?

Why is this SUMX function in DAX is working differently than expected?

我是 DAX 的初学者。我有一个名为“Actuals”的度量和一个名为“Accounts”的 table 以及一个名为“sign”的列 - 流入现金流为 1,流出现金流为 -1。使用这些,新度量定义如下:

Actuals with sign = SUMX("Accounts", [Actuals]*"Accounts[sign]")

根据我的理解,这应该遍历 Accounts 行并将符号列中的值乘以称为“actuals”的度量。对我来说,这似乎等同于将符号列的总和乘以“实际值”度量。但结果表明并非如此。我的理解不正确吗?这里的计算究竟是如何进行的?

上下文转换是一个过程,它将当前迭代行的所有列转换为等效的过滤上下文,进而过滤模型。我们认为只有明确提及 CALCULATE 才能启动上下文转换,但事实是每个度量都有一个隐藏的 CALCULATE 围绕它:

所以你的代码

Actuals with sign =
SUMX (
    'Accounts',
    [Actuals] * 'Accounts[sign]'
)

内部转化为:

Actuals with sign =
SUMX (
    'Accounts',
    CALCULATE ( [Actuals] ) * 'Accounts[sign]'
)

问题是,如果您没有至少 1 列具有唯一值,那么上下文转换后返回的结果会膨胀,因为在过滤模型时,重复的行将通过 1 转换为过滤上下文 1,并且然后他们过滤之前迭代过的行。因为内部没有Previous或Next的概念,引擎只知道它要过滤模型。

因此,如果您有 2 个重复的行,即第 1 行和第 5 行,那么在第 1 行,上下文转换将过滤第 1 行和第 5 行,在第 5 行,上下文转换将过滤第 5 行和第 1 行,然后 SUMX 将对值求和这会使数字膨胀。

这是它如何发生的一个小例子: