首页 > 解决方案 > 如何在 PowerQuery 查询中正确使用 table.group 来动态汇总不同的行和列?

问题描述

我在 Excel 2016 中创建了一个表,在其中放置了各种列名称、我想总结的列、设置新列名称的名称等。基本上我想要成为一个参数表。

然后,我在 Power Query 编辑器中创建了一个函数,并将上述表中的值传递给该函数。起初它失败了,但我发现Power Query 列名作为参数,它向我展示了如何将列名之一传递给参数。

乍一看,分组功能似乎有效,我看到了我想要分组的月份,但该值汇总了每个月的整个表,而不是单独的。我首先在普通查询中编辑数据:

let
Source = #"Final Dataset",
#"Grouped Rows" = Table.Group(Source, {"DateValue"}, {{"xOccurrences", each List.Sum([xOccurrences]), type number}}),
#"Added Custom4" = Table.AddColumn(#"Grouped Rows", "Plant Region", each "Ttl Occ PR"),
#"Added Custom" = Table.AddColumn(#"Added Custom4", "SD Region", each null)
in
#"Added Custom"

查询结果(如预期):

查询前

然后我将其参数化:

(groupByColumn as text, aggregateColumnName, optional plantRegionValue as text, optional sdRegionValue as text) =>
let
Source = #"Final Dataset",
#"Grouped Rows" = Table.Group(Source, {groupByColumn}, {{aggregateColumnName , each List.Sum(Table.Column(Source, aggregateColumnName)), type number}}),
#"Added Custom4" = Table.AddColumn(#"Grouped Rows", "Plant Region", each plantRegionValue),
#"Added Custom" = Table.AddColumn(#"Added Custom4", "SD Region", each sdRegionValue)
in
#"Added Custom"

我用两个虚拟行对参数表执行了该函数。两个输入行每个乘以 12 个月的行变成了 24(原始数据集为 12 个月),如预期的那样,但总和值是数据集的总和(1528):

函数结果

如您所见,Group 函数似乎忽略了我分配给 group 函数的第二个参数。我尝试了用各种连接替换 {groupByColumn},将 Table.Column 函数与要求和的列一样,并用原始列名 {"DateValue"} 静态替换它。列函数失败,而所有其他尝试都产生了相同的结果,每个月都与整个数据集的总和 1528 配对。

我认为它必须忽略第二个参数,所以我尝试将其留空:

#"Grouped Rows" = Table.Group(Source, {}
    , {{aggregateColumnName , each List.Sum(Table.Column(Source, aggregateColumnName)), type number}}),

正如预期的那样,它产生了 2 行,值为 1528。所以它只是部分忽略了参数 2:

在此处输入图像描述

有谁知道如何将变量列传递给组函数以动态处理参数表?我正在寻求动态计算第一个表的结果。

标签: powerbipowerquerym

解决方案


我不明白为什么你得到双倍的输出,但它没有像你期望的那样求和的原因是,当你写each List.Sum(Table.Column(Source, aggregateColumnName))的时候,它没有考虑到本地上下文,而是对整个Source表求和。

为了解决这个问题,让我们使用一个函数来代替每个,而不是像这样

(LocalContext) => List.Sum(Table.Column(LocalContext, aggregateColumnName))

整行将是:

#"Grouped Rows" =
Table.Group(
    Source,
    {groupByColumn},
    {{
        aggregateColumnName,
        (LocalContext) => List.Sum(Table.Column(LocalContext, aggregateColumnName)),
        type number
    }}
)

阅读材料:

https://bengribaudo.com/blog/2017/12/08/4270/power-query-m-primer-part3-functions-function-values-passing-returning-defining-inline-recursion

https://www.excelguru.ca/blog/2018/01/09/each-keyword-power-query/


推荐阅读