如何在PowerQuery查询中正确使用table.group来动态汇总不同的行和列?

问题描述 投票:0回答:2

我在 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"

查询结果(符合预期):

before the query

然后我将其参数化:

(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):

function results

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

我认为它一定是忽略了第二个参数,所以我尝试将其留空:

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

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

enter image description here

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

powerbi powerquery m
2个回答
3
投票

我不明白为什么你会得到双倍的输出,但它没有像你期望的那样求和的原因是,当你写

each List.Sum(Table.Column(Source, aggregateColumnName))
时,它没有考虑本地上下文,而是对整个
求和Source
桌子。

要解决这个问题,我们不要使用each,而是使用一个函数,如下所示

(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://excelguru.ca/each-keyword-power-query/


1
投票

您可以使用 each 关键字,如下所示:

#"Grouped Rows" =
Table.Group(
    Source,
    {groupByColumn},
    {{
        aggregateColumnName,
        each List.Sum(Table.Column(_, aggregateColumnName)),
        type number
    }}
)
© www.soinside.com 2019 - 2024. All rights reserved.