【问题标题】:Merging Two Files Together and Retaining All Columns合并两个文件并保留所有列
【发布时间】:2021-10-15 15:25:44
【问题描述】:

我认为这肯定一定很容易实现,但我尝试了各种追加和合并,但似乎无法正确实现。

我有两个文件,一个名为“Previous”,一个名为“Current”。两者都显示几乎相同的数据,如下所示:

ID    Status    Date_Changed
1     Closed    10/11/21
2     Open      10/01/21
3     Closed    10/03/21
4     Pending   10/15/21

我想将两个文件合并在一起,但保留所有列,使其结构如下。这将允许我显示已更改的表格等。

ID    Previous.Status    Current.Status    Previous.Date_Changed    Current.Date_Changed
1     Closed             Open              10/11/21                 10/15/21
2     Open               Closed            10/01/21                 10/15/21
3     Closed             Pending           10/03/21                 10/14/21

我知道这可能是由于我自己对 PowerBI 的幼稚。我尝试通过连接到文件夹来组合数据,但这似乎创建了一个新的数据集,其中的数据堆叠在顶部(即具有重复的 ID 值)。我尝试将合并查询用作 new 和 joinby ID,但这似乎也没有给我正确的输出?

【问题讨论】:

  • 两个表的行数是否相同,ID 值是否相同?
  • 不,可能会在“当前”文件中添加额外的行(它本质上是我们每个月都会进行的更新剪辑)。
  • 那么,Previous 中不应该有 Current 中没有的任何内容?
  • 是的,当然。不会从任何一个文件中删除任何内容。 “当前”将修改某些行的状态和日期,任何可能额外的行,但“上一个”中的每个 ID 都会存在。

标签: join merge powerbi powerquery m


【解决方案1】:

您可以从当前表开始,并在ID 上加入上一个表合并,然后展开列。根据需要重命名和重新排序列。

这是一个您可以粘贴到高级编辑器中的示例:

let
    CurrentSource = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMlTSUfIvSM0DUoYG+oam+kYGRoZKsTrRSkZAIeec/OLUFEw5Y6BQQGpeSmZeOlTSBCFpglMyFgA=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [ID = _t, Status = _t, Date_Changed = _t]),
    Current = Table.TransformColumnTypes(CurrentSource,{{"ID", Int64.Type}, {"Status", type text}, {"Date_Changed", type date}}),
    PreviousSource = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMlTSUXLOyS9OTQEyDA30DQ31jQyMDJVidaKVjIBC/gWpeRAZAyQZYzRdBsYIOROgUEBqXkpmXjrUSFOoZCwA", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [ID = _t, Status = _t, Date_Changed = _t]),
    Previous = Table.TransformColumnTypes(PreviousSource,{{"ID", Int64.Type}, {"Status", type text}, {"Date_Changed", type date}}),
    #"Merged Queries" = Table.NestedJoin(Current, {"ID"}, Previous, {"ID"}, "Previous", JoinKind.LeftOuter),
    #"Expanded Previous" = Table.ExpandTableColumn(#"Merged Queries", "Previous", {"Status", "Date_Changed"}, {"Previous.Status", "Previous.Date_Changed"}),
    #"Renamed Columns" = Table.RenameColumns(#"Expanded Previous",{{"Status", "Current.Status"}, {"Date_Changed", "Current.Date_Changed"}}),
    #"Reordered Columns" = Table.ReorderColumns(#"Renamed Columns",{"ID", "Previous.Status", "Current.Status", "Previous.Date_Changed", "Current.Date_Changed"})
in
    #"Reordered Columns"

注意:我在上面的查询中定义了 Previous 以便它是独立的。通常,这将是一个单独的查询。

【讨论】:

    【解决方案2】:

    您可以尝试以下步骤:

    1. 在每个表中创建一个名为“Source Name”的新列,并使用一个常量值来说明数据是来自“Previous”还是“Current”

    2. 然后在 Power Query 中追加这两个表。这仍然会将两个表堆叠在一起。

    3. 但现在您可以使用“源名称”列在矩阵视觉中区分它们。您可以使用

      添加矩阵视觉对象
      • 列字段中的“源名称”
      • 值字段中的“日期”和“状态”
      • “行”字段中的“ID”

    这是理想的,因为您以表格格式获取所有数据,这将有助于您在必要时进行进一步计算

    您可以查看下面的示例屏幕截图:

    【讨论】:

    • 可能不是 OP 想要的,但这可能是一个更容易使用的设计。
    • 是的,如果需要,这种结构将有助于简化任何其他计算
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    • 1970-01-01
    • 2014-05-08
    • 2021-06-26
    • 2021-09-07
    • 1970-01-01
    • 2011-03-10
    相关资源
    最近更新 更多