【问题标题】:Excel - Power Query 2016Excel - 电源查询 2016
【发布时间】:2018-12-29 15:34:01
【问题描述】:

我从两个表中获取数据。

客户(包含客户 ID 和订单/资金总额

订单(包含客户 ID 和每个订单)

我创建了一个 Power Query,然后选择了“将查询合并为新的”选项。选择匹配的列(客户 ID)并选择选项:Left Outer(所有来自第一个和,从第二个匹配 => 所有来自客户表,匹配来自订单表)。然后我扩展了查询的最后一列,以包括我想要的订单表中的内容,从而在左侧生成下表。右边那个是我要的。问题是资金金额已经是每个客户的总数。我不需要分解每个订单的价值。我仍然需要显示的订单,但我不需要它们的值(只是每个客户的总数)。可以像右下角那样做吗?否则,总和就差了。

【问题讨论】:

    标签: excel powerquery


    【解决方案1】:

    我认为您要做的是仅加入 Customer 列中每个值的第一个实例。似乎没有任何功能或 GUI 元素可以让您这样做(我查看了 reference documentation for Power Query M,也许我错过了一些东西)。

    为了复制您的数据,我从一些表开始(左表命名为Customers,右表命名为Orders):

    然后我使用下面的M 代码(前几行只是为了从工作表中获取我的表格):

    let
        customers = Excel.CurrentWorkbook(){[Name = "Customers"]}[Content],
        orders = Excel.CurrentWorkbook(){[Name = "Orders"]}[Content],
        merged = Table.NestedJoin(orders, {"CUSTOMER"}, customers, {"CUSTOMER"}, "merged", JoinKind.LeftOuter),
        indexColumn = Table.AddIndexColumn(merged, "Temporary", 0, 1),
        indexes =
            let
                uniqueCustomers = Table.Distinct(Table.SelectColumns(indexColumn, {"CUSTOMER"})), // Want to keep as table
                listOfRecords = Table.ToRecords(uniqueCustomers),
                firstOccurenceIndexes = List.Accumulate(listOfRecords, {}, (listState, currentItem) =>
                    List.Combine({listState, {Table.PositionOf(indexColumn, currentItem, Occurrence.First, "CUSTOMER")}})
                )
            in
                firstOccurenceIndexes,
        expandSelectively =
            let
                toBoolean = Table.TransformColumns(indexColumn, {{"Temporary", each List.Contains(indexes, _), type logical}}),
                tableOrNull = Table.AddColumn(toBoolean, "toExpand", each if [Temporary] then [merged] else null),
                dropRedundantColumns = Table.RemoveColumns(tableOrNull, {"merged", "Temporary"}),
                expand = Table.ExpandTableColumn(dropRedundantColumns, "toExpand", {"FUNDING"})
            in
                expand
    in
        expandSelectively
    

    如果您的表名和列名与我的匹配(包括区分大小写),那么您可能只需将上面的所有 M 代码复制粘贴到高级编辑器中并让它为您工作。否则,您可能需要根据需要进行调整。

    这是我将查询加载到工作表时得到的结果。

    可能有更好(更有效)的方法来做到这一点,但这就是我现在所拥有的。

    【讨论】:

      【解决方案2】:

      如果您不使用订单 ID 列,那么我建议您在合并资金之前在 OrderTable 上进行分组,以便您最终得到这样的表格:

      Region  Customer  OrderCount  Funding
      South   A         3           2394
      South   B         2           4323
      South   C         1           1234
      South   D         2           3423
      

      这样,您就不会出现混合级别的粒度,从而导致您在总数中看到的问题。

      【讨论】:

      • 抱歉,我的问题并不清楚。我确实需要订单 ID,但不需要特定订单的价值。事实上,我什至没有 Order 表中特定订单的值。让我在问题中添加一些说明
      猜你喜欢
      • 1970-01-01
      • 2015-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多