为什么我的 SUMX DAX 函数返回此结果?

Why is my SUMX DAX function returning this result?

假设我有 2 个 tables:

fTransactions

ProdID  RepID  Revenue
1       1      10
1       1      10
1       2      10

d销售代表

RepID   RepName
1       joe
2       sue

dSalesReps 具有以下度量且尚未应用过滤器:

RepSales:=CALCULATE(SUM(fTransactions[收入]))
RepSales2:=SUMX(fTransactions, CALCULATE(SUM(fTransactions[Revenue]))

第一项措施符合我的预期。它转到 fTransactions table 并对 Revenue 列求和。

第二个措施,经过大量的反复试验后,似乎在 fTransactions 的唯一行上对自己进行了分组。在上面的示例中,fTransactions 有 2 行所有内容都相同,最后一行有不同之处。这似乎导致以下结果:

(10 + 10) 第一次迭代求和第一个 "grouping"
+
(10 + 10) 第二次迭代,再次对第一个 "grouping" 求和
+
(10) 对第二个 "grouping"

求和的最后一次迭代 = 20 + 20 + 10 = 50

至少它看起来是这样运作的。我只是不明白为什么。我认为它会转到 fTransactions table,对每次迭代的所有 Revenue 求和,然后将这些总和作为最后一步求和。

这是由 "context-transition" 引起的(参见 sqlbi 更详细的解释)。

实际上,您的公式 "RepSales" 使用 "Row Context"(由 SUMX 创建),它被转换为等效的 "Filter Context"(由 CALCULATE),但是由于您没有table 中的一个唯一键,它在每次迭代中获取并使用多行,在下面的解释中。

对于第一行,行上下文是ProdID=1 AND RepID=1,它转换为等效的过滤上下文(保持不变,在这种情况下)是 ProdID=1 AND RepID=1 但是 过滤器上下文是全局的,并且两行(前两行)匹配此过滤器。 对每一行重复此操作。

公式 "RepSales" 不会发生这种情况,因为它不会重复多次(正如您已经注意到的那样)

这是您目前的情况:

为了证明这一点,只需在事务中添加一个 rowID table:

它不会发生,因为等效的 过滤器上下文 还包括 RowID 列,它只匹配一行

希望这对您有所帮助,请使用 sqlbi 文章作为参考,这将是理解此内容的详尽指南