【问题标题】:Excel Power Query Merge - Joining two tables where the common field is not unique without duplicate values in one specific column onlyExcel Power Query 合并 - 连接两个表,其中公共字段不唯一,仅在一个特定列中没有重复值
【发布时间】:2021-03-03 20:31:15
【问题描述】:

我有 2 个表,我正在通过 Excel Power Query 合并加入这些表。我有一个 Hours 表和一个 Parts 表。我在 Task_ID 上使用左外连接来保留 Hours 表中的所有行并添加 Parts 表中的匹配行。这很好,可以从 Parts 表中提取 Part No. 和 Cost 但是因为我的公共字段 (Task_ID) 不是唯一的,所以我得到了预期的重复行,但我不想在 中重复值Sum of Hours 列(使用聚合函数从较早的连接创建)。

我想要的输出是可能的,还是有更好的方法来解决这个问题?

例如,我想获得每个任务每周的总小时数和每个任务每周的总成本

小时

| Week | Task_ID | Sum of Hours |
| ---- |-------- |------------- |
| 01   | ABC#1   | 1            |
| 01   | ABC#2   | 3            |
| 02   | ABC#2   | 3            |

零件

| Task_ID | Part No. | Cost |
| ------- | -------- | ---- |
| ABC#1   | 111      | 10   |
| ABC#1   | 222      | 20   |
| ABC#2   | 111      | 10   |
| ABC#2   | 333      | 30   |
| ABC#2   | 444      | 40   | 

期望的输出

| Week | Task_ID | Sum of Hours | Part No. | Cost |
| ---- | ------- | ------------ | -------- | ---- |
| 01   | ABC#1   | 1            | 111      | 10   |
| 01   | ABC#1   | null         | 222      | 20   |
| 01   | ABC#2   | 3            | 111      | 10   |
| 01   | ABC#2   | null         | 222      | 20   |
| 01   | ABC#2   | null         | 333      | 30   |
| 02   | ABC#2   | 3            | 111      | 10   |
| 02   | ABC#2   | null         | 222      | 20   |
| 02   | ABC#2   | null         | 333      | 30   |

【问题讨论】:

    标签: powerquery


    【解决方案1】:

    不确定问题中显示的所需输出是否完全正确或仅作为粗略示例。例如,它似乎不包含 Task_ID 为 ABC#2 和 Part No. 为 444 的行,即使 ABC#2 出现在 Hours 表中。

    下面的代码应该会为您提供类似于您在预期输出中为 Sum Of Hours 列显示的内容(即,第一次出现的原始值,然后是任何重复出现的 null)。

    let
        hours = Table.FromColumns({
            {"01", "01", "02"},
            {"ABC#1", "ABC#2", "ABC#2"},
            {1, 3, 3}
        }, type table [Week = text, Task_ID = text, Sum Of Hours = text]),
        parts = Table.FromColumns({
            {"ABC#1", "ABC#1", "ABC#2", "ABC#2", "ABC#2"},
            {111, 222, 111, 333, 444},
            {10, 20, 10, 30, 40}
        }, type table [Task_ID = text, #"Part No." = text, Cost = text]),
        joined = Table.NestedJoin(hours, "Task_ID", parts, "Task_ID", "_joined", JoinKind.LeftOuter),
        nestedIndex = Table.TransformColumns(joined, {"_joined", each Table.AddIndexColumn(_, "_index"), type table}),
        expanded = Table.ExpandTableColumn(nestedIndex, "_joined", {"Part No.", "Cost", "_index"}),
        madeDuplicatesNull = Table.FromRecords(Table.TransformRows(expanded, each 
            Record.RemoveFields(_, {"_index", "Sum Of Hours"}) 
            & [Sum Of Hours = if [_index] > 0  then null else [Sum Of Hours]]
        ))
    in
        madeDuplicatesNull
    

    但是,如果这里的目标只是每周计算每个任务的一些数字,您可能可以直接计算数字(必要时删除重复数据)而不扩展行?比如:

    let
        hours = Table.FromColumns({
            {"01", "01", "02"},
            {"ABC#1", "ABC#2", "ABC#2"},
            {1, 3, 3}
        }, type table [Week = text, Task_ID = text, Sum Of Hours = text]),
        parts = Table.FromColumns({
            {"ABC#1", "ABC#1", "ABC#2", "ABC#2", "ABC#2"},
            {111, 222, 111, 333, 444},
            {10, 20, 10, 30, 40}
        }, type table [Task_ID = text, #"Part No." = text, Cost = text]),
        joined = Table.NestedJoin(hours, "Task_ID", parts, "Task_ID", "_joined", JoinKind.LeftOuter),
        grouped = Table.Group(joined, {"Week", "Task_ID"}, {
            {"Sum Of Hours", each List.Single([Sum Of Hours]), type number},
            {"Cost", each
                let
                    aggregated = Table.AggregateTableColumn(_, "_joined", {{"Cost", List.Sum, "Cost"}}),
                    cost = List.Single(aggregated[Cost])
                in cost
            , type number}
        })
    in
        grouped
    

    【讨论】:

      猜你喜欢
      • 2021-11-11
      • 2022-08-18
      • 1970-01-01
      • 1970-01-01
      • 2010-11-14
      • 2010-11-25
      • 2019-05-06
      • 2022-11-20
      • 2014-01-26
      相关资源
      最近更新 更多