powerbi - 为什么使用过滤器计算会返回此结果?
问题描述
假设我在 CustID
客户上链接了 2 个表
客户 ID 客户名称 1个 2乙 3℃
销售量
客户 ID 销售量
1 20 2 30 3 40 1 50
视觉的
客户 ID SumMeasure 1 2 30 3
SumMeasure = Calculate(Sum(Sales[SaleAmt]), Filter(Customers, CustID = 2))
我的问题是为什么度量在 CustID 不是 2 的行中返回空白?我最初认为计算会覆盖现有的过滤器,这意味着每行将获得 30,但是当涉及过滤器时显然不是这种情况。
我能弄清楚的唯一过程是基于 SQLBI 家伙的一篇文章,他们说:
ColorGreen = CALCULATE(COUNTROWS('Demo'), FILTER('Demo', 'Demo'[Color] = “Green”))
“我们将整个 Demo 表传递给 FILTER 条件,这会产生包含所有列的当前上下文的过滤器!通过这种方式,我们对绿色应用了限制,并且我们得到了与以前相同的结果(所有的行都没有颜色,但绿色,仍然应用数据透视表的颜色选择)但是,请记住,过滤器正在返回所有行。”
这是否意味着该过程在第一行中是这样的:
- 隐式过滤器上下文(CustID = 1)应用于客户(作为一种预过滤器)
- 这个预先过滤的表被传递给 Filter 函数,在该函数中逐行迭代进行比较
- 由于客户表(在预过滤器之后)中没有 CustID = 2 的行,因此它返回一个空白表
- 过滤器将最终过滤后的表(空白)传递给 Sum
- Sum 返回一个空白结果,因为没有什么可以求和
如果不是这种情况,有人可以逐步评估它的评估方式吗?请注意,我不是在问什么更有效。我只是想知道过滤器在这种情况下做什么/如何做的功能
解决方案
您基本上是正确的:您所谓的“预过滤器”实际上是 Power BI 视觉对象设置的过滤器上下文。
发生的情况是 FILTER 在 Power BI 视觉对象设置的筛选器上下文中进行评估,其中包含当前的 CustID。
因此,FILTER 会遍历已被当前 CustID 过滤的客户表,也就是说,只有一行。
然后它检查 FILTER 条件,如果不匹配,则不返回该行,因此 FILTER 返回空集。
当当前 CustID 与 FILTER 过滤条件匹配时,FILTER 返回该行。
在 FILTER 中使用 ALL(Customers) 将返回完整的客户表,而忽略 Power BI 视觉对象设置的筛选器,因此 FILTER 将始终返回一行,其中 CustID = 2
也就是说,此代码的更好实现将是
SumMeasure =
CALCULATE(
SUM( Sales[SaleAmt] ),
Customers[CustID] = 2,
REMOVEFILTERS( Customers )
)
因为它在单个列而不是整个表上使用过滤器,并且由于 REMOVEFILTERS 修饰符,它获得了我们在 ALL(Custoemers) 上应用过滤器的相同结果,该修饰符删除了完整客户表上的外部过滤器上下文。结果与我们在所有(客户)上使用 FILTER 获得的结果相同
推荐阅读
- angular - 为什么本地主机绝对网址有效但发布
- javascript - 如果文本框为空,则返回 true 或显示确认
- c# - 带有密码提示 C# 的多跳 SSH 问题
- php - PHPOffice Word 生成器打开文件时出现的问题
- swagger - 大摇大摆地请求正文模板
- javascript - JS文件中React Component类之外的代码什么时候运行?
- coldfusion - ColdFusion FilegetMimeType 给出不一致的结果
- linux - 如何在 char 数组中使用 linux wc 命令?
- javascript - 在 JavaScript 中搜索关键字
- assembly - 如何将多个数据直接从标签加载到寄存器