我的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下载它。
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
撤消了您使用切片器选择的类型。
注意:我之前所说的关于间接影响事物的内容并不是这里发生的事情。当您从行上下文到过滤器上下文进行上下文转换时,这是一个问题,但这里不适用。对困惑感到抱歉。
最后,我找到了它发生的原因!它被称为任意形状滤波器的覆盖。完整的解释可以在“DAX权威指南”,第10章,第439-443页找到。
请注意在同一个表的两个或多个列上使用多个过滤器,这是导致问题的最简单方法!