首页 > 解决方案 > Excel - 电源查询 2016

问题描述

我从两个表中获取数据。

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

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

在此处输入图像描述

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

在此处输入图像描述

标签: excelpowerquery

解决方案


我认为您要做的是仅加入Customer列中每个值的第一个实例。似乎没有任何功能或 GUI 元素允许您这样做(我查看了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上面的所有代码复制粘贴到高级编辑器中并让它为您工作。否则,您可能需要根据需要进行调整。

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

已加载查询

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


推荐阅读