You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Power BI查询编辑器中用M语言引用其他表?

在Power BI中用M语言引用其他表并实现数据对比

当然可以!M语言(Power Query)提供了多种方式来引用其他表、实现类似DAX中RELATED的关联逻辑,甚至能完成更灵活的数据对比需求,下面结合你的场景具体说明:

一、基础关联:合并查询(类似SQL JOIN)

如果只是需要像RELATED那样关联两张表并拉取字段,合并查询是最直接的方式,这相当于在数据加载阶段完成表关联:

  • 在Power Query编辑器中打开TableA
  • 点击「合并查询」→「合并查询作为新查询」
  • 在弹出窗口中选择TableB,设置关联的匹配列(比如共同的ID列),选择合并类型(比如左外部)
  • 合并后展开TableB的字段,就能在TableA中直接使用TableB的数据

对应的M语言代码示例(假设通过id列关联):

let
    Source = TableA,
    #"Merged Queries" = Table.NestedJoin(Source, {"id"}, TableB, {"id"}, "TableB", JoinKind.LeftOuter),
    #"Expanded TableB" = Table.ExpandTableColumn(#"Merged Queries", "TableB", {"keyword"}, {"keyword"})
in
    #"Expanded TableB"

二、实现类似SEARCH的文本匹配对比

你的DAX代码是检查main[text]中是否包含keywords[keyword]并返回匹配位置,在M语言中可以通过自定义列结合列表函数实现:

方法1:返回是否存在匹配(布尔值)

在TableA中添加自定义列,代码如下:

= List.AnyTrue(List.Transform(TableB[keyword], (kw) => Text.Contains([text], kw, Comparer.OrdinalIgnoreCase)))

这个代码会遍历TableB的所有关键词,检查当前行的text是否包含任意一个关键词,返回truefalse

方法2:返回第一个匹配的关键词位置(对齐DAX SEARCH的结果)

如果要返回匹配的起始位置,找不到则返回0,可以用:

= let
    keywordsList = TableB[keyword],
    matchResult = List.First(List.Select(List.Transform(keywordsList, (kw) => Text.PositionOf([text], kw, Occurrence.First)), (pos) => pos <> -1), -1)
in
    if matchResult = -1 then 0 else matchResult + 1 // M的位置从0开始,DAX从1开始,这里加1对齐逻辑

三、M语言 vs DAX:适用场景区别

  • DAX的RELATED是在数据模型层面操作,适合报表可视化阶段的计算,依赖表之间的预设关系
  • M语言的操作是在数据清洗/加载阶段完成,适合预处理数据,不需要依赖模型关系,更灵活支持复杂的文本、列表操作

内容的提问来源于stack exchange,提问作者Dennis Sheehan

火山引擎 最新活动