如何在Dax中过滤M2M表

时间:2018-08-03 16:40:40

标签: powerbi dax ssas-tabular

我正在尝试过滤与我的事实表具有M2M关系的表。这种关系如下所示。

事实->客户<-CustomerBridge->市场

在与桥接表的两种关系中都启用了双向过滤。我只希望返回某个市场。查询如下所示:

EVALUATE
FILTER (
    SUMMARIZE (
        Fact,
        'Market'[Market Name],
        "Sales", [Sum of Sales]
    ),
    'Market'[Market Name] = "My Market Name"
)

这给出了错误:

  

在输入表中找不到“ SUMMARIZE”功能中指定的“市场名称”列。

如何使此过滤器正常工作或Dax如何识别这种关系?

编辑:在事实和客户之间添加双向关系没有帮助

1 个答案:

答案 0 :(得分:1)

为使这种模型起作用,您需要启用从CustomerBridge到Customer的过滤器上下文传播。有几种方法可以使其起作用:在数据模型中使用双向关系,或使用DAX(CROSSFILTER,SUMMARIZE或扩展表过滤)。

PowerBI中最简单的解决方案是使用双向关系。您唯一需要的双向连接是“ CustomerBridge”和“ Customer”之间。所有其他关系应该是规则的(1:M): enter image description here 然后:

EVALUATE
ADDCOLUMNS (
    FILTER (
        VALUES ( Market[Market Name] ),
        Market[Market Name] = "My Market Name"
    ),
    "Sales", [Sum of Sales]
)

工作原理:

  • VALUES从“市场”表中创建一个不同的市场名称列表
  • 为所需的市场名称过滤列表。
  • 结果,FILTER返回了可能的最小表,因此公式应该很快
  • 最后,ADDCOLUMS遍历表格,并计算每个市场名称的销售额。

此方法的缺点:双向关系很危险,可能会对模型产生非常微妙的不良影响,例如过滤器上下文中的意外更改和性能下降。最佳实践是尽可能避免双向关系。

更好的方法是将程序双向过滤与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
)

在这里,桥表本身启用了双向过滤(它如何工作也是一个高级主题)。我喜欢这个公式的优美性,但是它可能是所有方法中最慢的一种,并且会降低模型的性能。