Excel-Power Query 2016

时间:2018-12-29 15:34:02

标签: excel powerquery

我从两个表中获取数据。

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

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

enter image description here

我创建了一个超级查询,然后选择“合并查询为新”选项。选择匹配的列(客户ID),然后选择以下选项:左外(全部从第一个开始,从第二个开始匹配=>全部从客户表开始,与订单表匹配)。然后,我扩展了查询的最后一列,以包含我想要从Order表中得到的内容,从而得到了下面的表格。右边的是我所追求的。问题在于资金额已经是每个客户的总和。我不需要分解每个订单的价值。我仍然需要显示的订单,但不需要它们的值(仅是每个客户的总数)。是否可以像下面的右图一样做到这一点?否则,总数将遥不可及。

enter image description here

2 个答案:

答案 0 :(得分:1)

我认为您要尝试的是仅与Customer列中每个值的第一个实例连接。似乎没有任何功能或GUI元素允许您执行此操作(我看过reference documentation for Power Query M,也许我错过了一些东西)。

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

My tables

然后我使用下面的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代码复制粘贴到“高级编辑器”中,并为您工作。否则,您可能需要根据需要进行调整。

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

Query loaded

可能会有更好(更有效)的方法来执行此操作,但这就是我目前所拥有的。

答案 1 :(得分:0)

如果您不使用订单ID列,那么我建议在合并资金之前在List<ImageView> images = sources.map(source -> { ImageView iv = new ImageView(new Image(source.toUri().toString(), true)); iv.setPreserveRatio(true); return iv; }).collect(Collectors.toList()); content.getChildren().setAll(images); 上进行分组依据,以便最终得到一个像这样的表:

OrderTable

这样,您就不会有混合的粒度级别,而这些粒度级别会导致出现总计问题。