首页 > 解决方案 > 为什么使用过滤器计算会返回此结果?

问题描述

假设我在 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 条件,这会产生包含所有列的当前上下文的过滤器!通过这种方式,我们对绿色应用了限制,并且我们得到了与以前相同的结果(所有的行都没有颜色,但绿色,仍然应用数据透视表的颜色选择)但是,请记住,过滤器正在返回所有行。”

这是否意味着该过程在第一行中是这样的:

如果不是这种情况,有人可以逐步评估它的评估方式吗?请注意,我不是在问什么更有效。我只是想知道过滤器在这种情况下做什么/如何做的功能

标签: powerbidax

解决方案


您基本上是正确的:您所谓的“预过滤器”实际上是 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 获得的结果相同


推荐阅读