为什么我的 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 文章作为参考,这将是理解此内容的详尽指南
假设我有 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 文章作为参考,这将是理解此内容的详尽指南