如何在 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 本身启用(具体如何工作也是一个高级主题)。我喜欢这个公式的优雅,但它可能是所有方法中最慢的,并且会降低模型性能。
我正在尝试过滤与我的事实 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 本身启用(具体如何工作也是一个高级主题)。我喜欢这个公式的优雅,但它可能是所有方法中最慢的,并且会降低模型性能。