excel - 为什么我的计算列中的 DAX 公式在一个实例中使用传播而不在另一个实例中进行过滤?
问题描述
假设我有几张桌子:
f交易
Index ProdID RepID Revenue
1 1 1 10
2 1 1 20
3 2 2 30
4 2 2 10
dSalesReps
RepID RepName CC1 CCC2
1 joe 40 70
2 sue 30 70
3 bob 70
CC1 包含一个计算列:
CALCULATE(SUM(fTransactions[Revenue]))
我的理解是,它采用行上下文并更改为过滤上下文以将 fTransaction 表过滤到 RepID 并求和。根据关于该主题的sqlbi文章有意义:
“因为包含当前产品的过滤器上下文由于两个表之间的关系而自动传播到销售”
CC2 包含一个计算列,其中包含:
SUMX(fTransactions, CALCULATE(SUM(fTransactions[Revenue]))
但是,这一列在所有列中都放置了相同的值,并且似乎不像其他示例那样传播 RepID。相同的 sqlbi文章提到对整个 fTransactions 行进行了过滤。我的问题是为什么它在这里而不是另一个示例中这样做,以及 RepID 的传播发生了什么?
“CALCULATE 在表的所有列上放置一个过滤器以识别单行,而不是在其行号上”
解决方案
在循环中创建计算列:power pivot 逐行计算结果。CALCULATE 将每一行转换为过滤上下文(上下文转换)。
但是,在第二个公式中,您有 2 个循环,而不是一个:首先,它循环 dSalesReps 表(因为这是您创建列的位置);其次,它循环 fTransactions 表,因为您使用的是 SUMX 函数,它是一个迭代器。
CALCULATE 函数仅在第二个循环中使用,强制 fTransactions 表中每一行的上下文转换。但是没有 CALCULATE 可以强制 dSalesReps 中的行进行上下文转换。因此,销售代表没有过滤。
解决问题很容易:只需将第二个公式包含在 CALCULATE 中。更好的是,删除第二个 CALCULATE - 这不是必需的,并且会使公式变慢:
CCC2 =
CALCULATE(
SUMX(fTransactions, SUM(fTransactions[Revenue]))
)
这个公式与第一个公式基本相同(背景中的第一个公式转换为第二个,SUM 函数只是 SUMX 的语法糖)。
推荐阅读
- javascript - 循环遍历对象并显示图像
- java - executeQuery() 返回空的 ResultSet
- javascript - Redux 表单字段级别验证在 Edge 中不起作用
- laravel - 如何在 Laravel 中使用原子锁?
- javascript - 如何验证 Grafana 图表并将其嵌入 iframe?
- acumatica - 预填充 PXFilter 后,如何访问用户在对话框智能面板中“按摩”的数据?
- python - PythonSpark:需要从文件列执行配置单元查询
- gridview - Yii2 Gridview URL 太长
- python - 为两个不同的按钮 Web 抓取 Python
- python - 为什么 tkinter 不向我显示图像?