当评估此Filter(All(Column),...)语法时,实际发生了什么?

问题描述 投票:2回答:2

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

我通过点击图表选择一个特定的Type =“B”,并在Datetime选择一个切片器的时间段,然后使用下面的度量来计算类型“A”中有多少个不同的名称(正如预期的那样)应该没有A和B同时记录)。那时我完全被结果搞糊涂了:

(My Power BI版本是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)子集,尝试在子集内找到类型为“A”的行(Type =“B”+ Type =“A”+ Datetime),然后刚刚失败。所以FILTER没有给出最终计算,结果是预期的空白(当我选择B型时应该没有A Type记录)。

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


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

谢谢你的建议!


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

powerbi dax
2个回答
2
投票

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

Correct版本中,这意味着当你传入Data时,根据你的切片器选择,在Type = "B"Datetime上过滤该表。然后添加条件Data[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和日期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撤消了您使用切片器选择的类型。


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


0
投票

最后,我找到了它发生的原因!它被称为任意形状滤波器的覆盖。完整的解释可以在“DAX权威指南”,第10章,第439-443页找到。

请注意在同一个表的两个或多个列上使用多个过滤器,这是导致问题的最简单方法!

© www.soinside.com 2019 - 2024. All rights reserved.