我正在尝试过滤与我的事实表具有M2M关系的表。这种关系如下所示。
事实->客户<-CustomerBridge->市场
在与桥接表的两种关系中都启用了双向过滤。我只希望返回某个市场。查询如下所示:
EVALUATE
FILTER (
SUMMARIZE (
Fact,
'Market'[Market Name],
"Sales", [Sum of Sales]
),
'Market'[Market Name] = "My Market Name"
)
这给出了错误:
在输入表中找不到“ SUMMARIZE”功能中指定的“市场名称”列。
如何使此过滤器正常工作或Dax如何识别这种关系?
编辑:在事实和客户之间添加双向关系没有帮助
答案 0 :(得分:1)
为使这种模型起作用,您需要启用从CustomerBridge到Customer的过滤器上下文传播。有几种方法可以使其起作用:在数据模型中使用双向关系,或使用DAX(CROSSFILTER,SUMMARIZE或扩展表过滤)。
PowerBI中最简单的解决方案是使用双向关系。您唯一需要的双向连接是“ CustomerBridge”和“ Customer”之间。所有其他关系应该是规则的(1:M): 然后:
EVALUATE
ADDCOLUMNS (
FILTER (
VALUES ( Market[Market Name] ),
Market[Market Name] = "My Market Name"
),
"Sales", [Sum of Sales]
)
工作原理:
此方法的缺点:双向关系很危险,可能会对模型产生非常微妙的不良影响,例如过滤器上下文中的意外更改和性能下降。最佳实践是尽可能避免双向关系。
更好的方法是将程序双向过滤与CROSSFILTER结合使用。例如,此措施:
M2M Sale =
CALCULATE (
[Sum of Sales],
CROSSFILTER ( Customer[Customer_ID], CustomerBridge[Customer_ID], BOTH )
)
将在没有双向关系的情况下正常工作。如果在行上为“具有市场名称的销售总额”创建一个矩阵,则会看到按市场名称的销售金额。这种方法的优势在于,它仅在需要时才以编程方式启用双向过滤,而不会产生不可预测的副作用。
使用SUMMARIZE可以获得相同的结果
M2M Sale =
CALCULATE (
[Sum of Sales],
SUMMARIZE ( CustomerBridge, Customer[Customer_ID] )
)
此公式的工作原理是一个高级话题,但效果很好。
最后,在过去,使用“扩展表过滤”方法:
M2M Sale =
CALCULATE (
[Sum of Sales],
CustomerBridge
)
在这里,桥表本身启用了双向过滤(它如何工作也是一个高级主题)。我喜欢这个公式的优美性,但是它可能是所有方法中最慢的一种,并且会降低模型的性能。