【问题标题】:Power Query Sum of column by group as new columnPower Query 按组的总和作为新列
【发布时间】:2020-08-14 15:27:35
【问题描述】:

所以我是 power query 的新手,我只是浪费了一个多小时来寻找可以在许多其他程序中轻松完成的事情。

我只想创建一个新列来总结另一列。例如,检查百分比是否正确,如果不规范化。我不想分组和缩小表格。

我一直在左右搜索,并尝试使用类似的东西添加一个新列,如“Group Sum” = list.sum([数字]) = 计算(SUM([数字])

只是为了得到所有条目的总和200。没有成功。

也许是我,但我真的不明白其中的逻辑。

我现在试过了

let
    Quelle = Excel.CurrentWorkbook(){[Name="Tabelle1"]}[Content],
        #"Geänderter Typ" = Table.TransformColumnTypes(Quelle,{{"Group", type text}, {"Gender", type text}, {"Number", Int64.Type}, {"Group Sum", Int64.Type}, {"Spalte1", Int64.Type}})
        #"Added Custom" = Table.AddColumn(#"Geänderter Typ","Group Sum",(i)=>List.Sum(Table.SelectRows(#"Geänderter Typ", each [Group]=i[Group])[Number]), type number )
    in
        #"Geänderter Typ"

这会导致错误并且

let
    Quelle = Excel.CurrentWorkbook(){[Name="Tabelle1"]}[Content],
    #"Geänderter Typ" = Table.TransformColumnTypes(Quelle,{{"Group", type text}, {"Gender", type text}, {"Number", Int64.Type}, {"Group Sum", Int64.Type}}),
    #"Hinzugefügte benutzerdefinierte Spalte" = Table.AddColumn(#"Geänderter Typ", "Benutzerdefiniert", each Table.Group(Quelle, {"Group"}, {{"Group Sum", each List.Sum([Number]), type nullable number}}))
in
    #"Hinzugefügte benutzerdefinierte Spalte"

这给了我一个新列,其中所有条目都说“表格”

【问题讨论】:

  • 最简单的 ,,, 列 [Group] 和总和列 [Number] 上的组。使用左外连接(默认)将其合并回原始表,并使用新列顶部的箭头展开
  • 第一步很简单,我在哪里可以找到左外连接?我是否需要按结果将组保存在不同的表中?
  • 我只想在这里指出这个例子令人困惑,因为两组的总和是相同的。这意味着您可能会认为某些东西在起作用,而实际上它不是。我相信至少在下面的一个答案中就是这种情况,它部分使用 Table.Distinct() 并且这只是巧合,因为组总和是相同的,所以如果你“选择一个组总和并应用它到所有组”看起来它正在工作。

标签: excel powerquery


【解决方案1】:

这里有另外两个选项。这些示例假定您的源表名为 Table1。以下是我在 Excel 中查看其源代码的方式:

请注意,它确实没有有一个 Group Sum 列。查询将得出这一点。

选项 1。

点击添加列,然后点击自定义列,像这样填写屏幕,然后点击确定:

你应该看到这样的表格:

然后只需单击自定义列第一行中的表格,您应该会得到一个如下所示的表格:

然后您可以将这个新表与原始源表(Table1)合并。单击 Home > Merge Queries 并像这样填写合并信息,然后单击 OK。 (请注意,此时同一查询“Table1”正在合并到自身,并且每个条目仅选择 Group 列。)

你应该看到这样的表格:

然后,在该表上方的公式栏中,您会看到 = Table.NestedJoin(Custom, {"Group"}, Custom, {"Group"}, "Custom", JoinKind.LeftOuter),将 Custom 的第一个实例更改为 Source,因此该行改为 = Table.NestedJoin(Source, {"Group"}, Custom, {"Group"}, "Custom", JoinKind.LeftOuter)

即改成:

收件人:

然后通过单击 按钮展开新的自定义列,仅选择组总和列,清除“使用原始列名作为前缀”旁边的复选框,然后单击确定:

你应该得到这个结果:

这是 M 代码:

let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Group", type text}, {"Gender", type text}, {"Number", Int64.Type}}),
    #"Added Custom" = Table.AddColumn(#"Changed Type", "Custom", each Table.Group(Source, {"Group"}, {{"Group Sum", each List.Sum([Number]), type nullable number}})),
    Custom = #"Added Custom"{0}[Custom],
    #"Merged Queries" = Table.NestedJoin(Source, {"Group"}, Custom, {"Group"}, "Custom", JoinKind.LeftOuter),
    #"Expanded Custom" = Table.ExpandTableColumn(#"Merged Queries", "Custom", {"Group Sum"}, {"Group Sum"})
in
    #"Expanded Custom"

(您可以在上面的代码中分别将 Table1、Source 和 Changed Type 替换为 Tablelle1、Quelle 和 #"Geänderter Typ",以与 Max 的语言保持一致。)

选项 2。

点击 Transform 然后 Group By 并像这样填写屏幕并点击 OK:

然后展开 AllData 列,只选择 Gender 和 Number 列,如下所示:

结果:

这是 M 代码:

let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    #"Grouped Rows" = Table.Group(Source, {"Group"}, {{"AllData", each _, type table [Group=text, Gender=text, Number=number]}, {"Group Sum", each List.Sum([Number]), type number}}),
    #"Expanded AllData" = Table.ExpandTableColumn(#"Grouped Rows", "AllData", {"Gender", "Number"}, {"Gender", "Number"})
in
    #"Expanded AllData"

【讨论】:

  • 对不起,我在第一步失败了,我使用添加自定义列并输入这个 'Table.Group(Source, {"Group"}, {{"Group Sum", each List.Sum( [Number]),键入可为空的数字}})' 并显示 Expression.Error: Name source not Recognized。我应该使用“Tabelle1”吗?
  • 我认为,根据您提供的示例,您的 M 代码中有 Quelle 而不是 Source,所以我认为您应该使用 Quelle 代替 Source。
  • 是的,我试过了,但后来我在每个条目中只得到“表格”
  • 我注意到您正在使用您的表 Tabelle1,其中 Group Sum 列已作为您的源。我的 Table1 不包括 Group Sum 列,因为那是我通过查询得出的。我相信将它放在源代码中会产生冲突。我认为您应该从 Excel 中的 Tabelle1 中删除该列。我将根据您的示例将选项 1 的 M 代码附加到我上面的答案中。我将使用 Tablelle1、Quelle 和 #"Geänderter Typ",因此您可以直接剪切和粘贴。
  • 我认为选项 1 是错误的,并且似乎只起作用,因为这里所有组的总和都是相同的。似乎第一个操作(添加自定义列)生成了一个新列,该列由每行的一个表组成。这些表是相同的,其中任何一个都有我们想要的值。我们只需要将它加入到原始表中。但是,其 Table.Distinct() 的下一个操作似乎并没有真正做到这一点。它进行笛卡尔连接,然后删除重复的行。使用不同的组总和,这会使数据集相乘,并且不会给出所需的结果。
【解决方案2】:

试试

let Quelle= Excel.CurrentWorkbook(){[Name="Tabelle1"]}[Content],
#"Promoted Headers" = Table.PromoteHeaders(Quelle, [PromoteAllScalars=true]),
#"Geänderter Typ" = Table.TransformColumnTypes(#"Promoted Headers",{{"Group", type text}, {"Gender", type text}, {"Number", Int64.Type}}),
#"Added Custom" = Table.AddColumn(#"Geänderter Typ","Group Sum2",(i)=>List.Sum(Table.SelectRows(#"Geänderter Typ", each [Group]=i[Group]) [Number]), type number )
in #"Added Custom"

【讨论】:

    【解决方案3】:

    分组和加入方法

    我现在已经看到了几种方法来做到这一点,但我认为最有效的可能是基于以前的 cmets 和此处答案的 group-and-join 方法。只需要一行:

    let
        Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
        #"Added Custom" = Table.Join(Source, "Group", Table.Group(Source,{"Group"},{{"Group Sum", each List.Sum([Number]), type nullable number}}), "Group")
    in
        #"Added Custom"
    

    其中的 Table.Group() 部分创建了一个表格,其中包含分组变量的每个唯一值(此处为“组”),并且对于每个唯一值,其汇总值(所有 [Number] 的总和)此处具有相同“组”值的行)。将这些汇总值附加到原始表上成为 Table.Join() 的工作。 Table.Join() 函数获取四个输入参数:1.) 原始表,2.) 原始表中的分组列(此处为“组”),3.) 汇总表(即 Table.Join 的输出)。此处为 Group() 函数)和 4.) 汇总表中的分组列(此处也称为“组”)。

    我对此进行了测试,得到的结果如下:

    注意:我更改了问题中的 Number 列值以显示代码正在运行。在原始问题中提供的示例中,两个组的 Group Sum 都是 100,这似乎使另一个答案中建议的方法看起来像是在起作用,但实际上却不起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多