首页 > 解决方案 > 评估此 Filter(All(Column),...) 语法时真正发生了什么?

问题描述

我的 PowerBI Desktop 模型中只有一个名为“Data”的表,其中包含 [Datetime]、[Type]、[Name] 和其他几列。

我通过单击图表选择特定的 Type="B",并在 Datetime 上使用切片器选择一段时间,然后使用下面的度量来计算 Type "A" 中有多少不同的名称(如预期的那样,有不应该同时有 A 和 B 的记录)。那时我对结果完全感到困惑:

(我的 PowerBI 版本是 2019 年 4 月的最新版本。)


Wrong =
CALCULATE (
    DISTINCTCOUNT ( Data[Name] ),
    FILTER ( ALL ( Data[Type] ), Data[Type] = "A" )
)

虽然这一措施被证明是正确的:

Correct = 
CALCULATE ( 
    DISTINCTCOUNT ( Data[Name] ), 
    FILTER ( Data, Data[Type] = "A" ) 
)

我认为正在发生的事情(可能错过了一些重要的事情):

由于这两个度量在外部共享相同的显式过滤器上下文CALCULATE,并且它们最终计算的内容相同,因此唯一的问题是“最终提供的上下文是什么FILTER”?

使用正确的版本,FILTER只需获取 (Type="B" + Datetime) 子集,尝试在子集 (Type="B" + Type="A" + Datetime) 中查找类型为“A”的行,它只是失败。所以FILTER最终计算没有给出任何结果,结果如预期的那样是空白的(当我选择 B 型时应该没有 A 型记录)。

使用错误的版本,FILTER(只有一列)忽略类型(最初是“B”)上的所有过滤器上下文,然后它应用一个新的(Type="A")来替换原来的。而且由于每一列都是单独过滤的,所以 Datetime 上的过滤器根本不会改变。所以最终的上下文CALCULATE应该是一个子集,同时包含类型“A”和选择的时间段(类型=“A”+日期时间),这使得最终结果“类型A的不同名称的数量期间”,和我当初选择的Type无关。


但问题是,根据它给出的奇怪结果,[Wrong]它绝对不是我所想的,我对此一无所知。我已经尝试了很多我认为合理的方法来测试它是如何工作的,但他们只是失败了......

感谢您的任何建议!


我制作了一个很小的 ​​pbix 文件进行测试(具有相同的结构和问题): https : //pan.baidu.com/s/1gNZDNlICFLkMdPpPArb8cQ 如果需要,使用 yf7f 下载它。

标签: powerbidax

解决方案


FILTER函数将表作为其第一个参数。此表在您正在操作的过滤器上下文中进行评估。

在该Correct版本中,这意味着当您传入 时,Data该表会根据您的切片器选择进行过滤。然后添加条件,该条件不适用于过滤集中的任何内容,因为您已经选择了该类型。因此,它返回空白,因为表是空的。Type = "B"DatetimeData[Type] = "A"Data"B"


编辑:划掉我之前说的内容,然后看一个例子。以此作为一个完整的表开始:

Name  Type  Datetime
Alex  A     1/3/2019
Alex  A     1/4/2019
Bob   A     1/5/2019
Bob   B     1/5/2019
Bob   A     1/7/2019
Carla B     1/3/2019
Carla B     1/4/2019
Dan   A     1/6/2019

B如果我对 type和 dates进行切片1/3/2019 - 1/5/2019,则剩下的行如下:

Name  Type  Datetime
Bob   B     1/5/2019
Carla B     1/3/2019
Carla B     1/4/2019

当我们ALL( Data[Type] )在此上下文中计算时,我们会得到下表,这与删除Type切片器但保留日期切片器相同:

Name  Type  Datetime
Alex  A     1/3/2019
Alex  A     1/4/2019
Bob   A     1/5/2019
Bob   B     1/5/2019
Carla B     1/3/2019
Carla B     1/4/2019

现在,当您添加Data[Type] = "A"条件时,您将获得此表,这与您最初过滤A而不是B(并保留日期切片器)相同,您将获得以下内容:

Name  Type  Datetime
Alex  A     1/3/2019
Alex  A     1/4/2019
Bob   A     1/5/2019

这显然有两个不同的名称,而不是没有。在该Correct版本中,不同之处在于您A在上面的第二个表格而不是第三个表格中过滤类型。

基本上,ALL撤消您使用切片器选择的类型选择。


注意:我之前所说的间接影响事物并不是这里发生的事情。当您进行从行上下文到过滤上下文的上下文转换时,这是一个问题,但不适用于此处。对困惑感到抱歉。


推荐阅读