如何在 Dax 中过滤 M2M table

How to filter on M2M table in Dax

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

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

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

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

这给出了错误:

The column 'Market Name' specified in the 'SUMMARIZE' function was not found in the input table.

我怎样才能让这个过滤器起作用或让 Dax 识别这种关系?

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

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

PowerBI 中最简单的解决方案是使用双向关系。您唯一需要的双向连接是 "CustomerBridge" 和 "Customer" 之间。所有其他关系应该是规则的 (1:M): 那么:

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

工作原理:

  • VALUES 从 table "Market"
  • 创建一个不同的市场名称列表
  • 该列表已筛选出所需的市场名称。
  • 因此,FILTER returns 尽可能小 table,所以公式应该很快
  • 最后,ADDCOLUMS 迭代 table,并计算每个市场名称的销售额。

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

更好的方法是使用带有 CROSSFILTER 的程序化双向过滤。例如,这个措施:

M2M Sale =
CALCULATE (
    [Sum of Sales],
    CROSSFILTER ( Customer[Customer_ID], CustomerBridge[Customer_ID], BOTH )
)

没有双向关系也能正常工作。如果您在行上为带有市场名称的销售额总和创建矩阵,您将看到按市场名称列出的销售额。这种方法的优点是它仅在需要时以编程方式启用双向过滤,并且没有 unpredictable 副作用。

使用 SUMMARIZE 可以获得相同的结果:

M2M Sale =
CALCULATE (
    [Sum of Sales],
    SUMMARIZE ( CustomerBridge, Customer[Customer_ID] )
)

这个公式的工作原理有点高级,但效果很好。

最后,在过去 "expanded table filtering" 方法被使用:

M2M Sale =
CALCULATE (
    [Sum of Sales],
    CustomerBridge
)

此处,双向过滤由网桥 table 本身启用(具体如何工作也是一个高级主题)。我喜欢这个公式的优雅,但它可能是所有方法中最慢的,并且会降低模型性能。