excel - 为什么我的 SUMX DAX 函数会返回此结果?
问题描述
假设我有 2 张桌子:
f交易
ProdID RepID Revenue
1 1 10
1 1 10
1 2 10
dSalesReps
RepID RepName
1 joe
2 sue
dSalesReps 具有以下未应用过滤器的措施:
RepSales:=CALCULATE(SUM(fTransactions[Revenue]))
RepSales2:=SUMX(fTransactions, CALCULATE(SUM(fTransactions[Revenue]))
第一项措施执行我认为的方式。它转到 fTransactions 表并汇总 Revenue 列。
第二个措施,经过大量的试验和错误来弄清楚,似乎在 fTransactions 中的唯一行上将自己分组。在上面的示例中,fTransactions 有 2 行所有内容都相同,最后一行内容不同。这似乎导致以下结果:
(10 + 10) 对第一个“分组”求和的第一次迭代
+
(10 + 10) 对第一个“分组”求和的第二次迭代
+
(10) 对第二个“分组”求和的最后一次迭代"
= 20 + 20 + 10 = 50
至少它看起来是这样运行的。我只是不明白为什么。我认为它会转到 fTransactions 表,对每次迭代的所有收入求和,然后将这些总和作为最后一步。
解决方案
这是由称为“上下文转换”的东西引起的(参见sqlbi更详细的解释)。
在实践中,您的公式“RepSales”使用“行上下文”(由 SUMX 创建),它在等效的“过滤上下文”(由 CALCULATE)中打开,但由于您在表中没有唯一键,因此它得到并在每次迭代中使用多行,在说明下方。
对于第一行,行上下文是 ProdID=1 AND RepID=1,它在等效过滤器上下文(在这种情况下保持不变)是 ProdID=1 AND RepID=1但过滤器上下文是全局的,并且两个行(前 2 行)匹配此过滤器。这对每一行重复。
公式“RepSales”不会发生这种情况,因为它不会重复多次(正如您已经注意到的)
这是你目前的情况:
它不会发生,因为等效的筛选上下文还包括 RowID 列,该列仅匹配一行
希望这会有所帮助,使用 sqlbi 文章作为参考,这将是理解这一点的详尽指南
推荐阅读
- javascript - 需要实现一个滚动列表,所选项目可见
- javascript - 如何从 JSON 文件中获取 JSON 数据
- java - Java AES-128 ECB 加密
- python - 用每两个直方图数据集绘制两个理论 PDF
- javascript - AJAX 在没有 ASP:button 的情况下将数据发布到 DB
- reactjs - 如何设置父级的 NavigationOptions?
- python - 尽管分配了正确的服务帐户,但使用 Google AutoML vision Python API 得到 403 响应
- python - 绘制分段图
- html - flexbox中带有图像的滚动条
- ios - 如何让 lldb 服务器启动一个新进程而不附加到现有进程?