【问题标题】:Merging two tables based on conditions, using Power Query excel or a VBA?根据条件合并两个表,使用 Power Query excel 或 VBA?
【发布时间】:2022-01-21 03:52:15
【问题描述】:

我有一个大型数据集 (A),我需要根据以下条件与另一个(较小的)表 (B) 合并: 如果表 (A) 中列 (X) 中单元格的第一个字母与表 (B) 中列 (Y) 中的单元格内容匹配,则匹配/合并。 否则,检查列 (X)、表 (A) 中单元格的前两个字母是否与列 (Y)、表 (B) 中的单元格内容匹配,然后匹配/合并。 请注意,表 B 中的列 (Y) 具有唯一值;在字母(字母)或两个字母上。

这是一个例子: [一个例子]

Tables

【问题讨论】:

    标签: excel merge powerquery


    【解决方案1】:

    我想我做了类似的事情,但没有写出像你这样的代码。相反,我在第一个表 (A) 中创建了两列,其中一个包含列 (X) 中的所有第一个字母,另一个包含所有前两个字母(来自列 (X)。 接下来,我根据以下步骤进行合并:

    1. 基于新列(一个字母)合并表(A)和表(B) 来自 (X) 列和表 (B) 中的字母列。

    2. 随后,我从 新的合并表 (M1)

    3. 回到表 (A) 并基于包含两个的列合并 表 (B) 中的字母和字母列。

    4. 清除所有“Null”值(删除它们)。现在我有一个新的 合并表 (M2)

    5. 最后,我做了一个追加操作,所以表格(Merge M1)和 (Merge M2) 合并。

    我确实注意到了一些重复,比如有几行重复。我找不到原因。 这个过程是否有意义或是否有冗余? 我正在尝试学习如何在 M 中编码以避免任何错误

    【讨论】:

      【解决方案2】:

      认为可能提供您正在寻找的结果。它不会进行简单的基于单个条件的合并。它使用了组合的合并:TableA和TableB之间的一个基于TableA的X列每行的第一个字符和TableB中Y列的每一行的值,另一个基于Column每行的前两个字符TableA 中的 X 和 TableB 的 Y 列中每一行的值。它扩展每个合并的结果列以仅显示列中合并的 Y 列值。然后它将这两个合并结果列的结果合并为一列,并使用该列再次与 TableB 的 Y 列合并,以拉入其余的 Y 列值。

      let
          Source = Excel.CurrentWorkbook(){[Name="TableA"]}[Content],
          #"Changed Type" = Table.TransformColumnTypes(Source,{{"Column X", type text}, {"Column X 2", type number}, {"Column X 3", type number}, {"Column X 4", type number}, {"Column X 5", type number}, {"Column X 6", type number}, {"Column X 7", type number}}),
          #"Added Custom" = Table.AddColumn(#"Changed Type", "Column X First 1", each Text.Start([Column X],1)),
          #"Added Custom1" = Table.AddColumn(#"Added Custom", "Column X First 2", each Text.Start([Column X],2)),
          #"Merged Queries" = Table.NestedJoin(#"Added Custom1", {"Column X First 1"}, TableB, {"Column Y"}, "Column Y First 1", JoinKind.LeftOuter),
          #"Expanded TableB" = Table.ExpandTableColumn(#"Merged Queries", "Column Y First 1", {"Column Y"}, {"Column Y First 1"}),
          #"Merged Queries1" = Table.NestedJoin(#"Expanded TableB", {"Column X First 2"}, TableB, {"Column Y"}, "Column Y First 2", JoinKind.LeftOuter),
          #"Expanded TableB1" = Table.ExpandTableColumn(#"Merged Queries1", "Column Y First 2", {"Column Y"}, {"Column Y First 2"}),
          #"Merged Columns" = Table.CombineColumns(Table.TransformColumnTypes(#"Expanded TableB1", {{"Column Y First 2", type text}}, "en-US"),{"Column Y First 1", "Column Y First 2"},Combiner.CombineTextByDelimiter("", QuoteStyle.None),"Column Y Match"),
          #"Merged Queries2" = Table.NestedJoin(#"Merged Columns", {"Column Y Match"}, TableB, {"Column Y"}, "TableB", JoinKind.LeftOuter),
          #"Expanded TableB2" = Table.ExpandTableColumn(#"Merged Queries2", "TableB", {"Column 1", "Column 2", "Column 3", "Column Y"}, {"Column 1", "Column 2", "Column 3", "Column Y"}),
          #"Removed Columns" = Table.RemoveColumns(#"Expanded TableB2",{"Column X First 1", "Column X First 2", "Column Y Match"})
      in
          #"Removed Columns"
      

      【讨论】:

      • @Curiousmind1917 - 如果我明白你在说什么,在你的问题中添加为你原来问题的单独答案:你做了两个基于 X 列和 Y 列的单独合并,输出他们的结果到两个单独的表;然后删除每个表中在 Y 列中有空值的行;然后将两个单独的表附加到一个表中。我遵循了这种方法,并在我的比赛中得到了相同的结果。 (它比我的左连接原始结果更像是一个内部连接结果,它也显示不匹配。)我没有看到任何错误。我没有得到任何重复。
      猜你喜欢
      • 2020-06-19
      • 2022-01-13
      • 1970-01-01
      • 2022-08-19
      • 2020-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多