Power Query:具有聚合列动态列表的 Table.Group

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

为了实现我的目标,我奋斗了几个小时。

目标是在使用 Table 时使用带有列名的列表进行聚合。分组而不是固定的列列表。

我已经将 GroupColumns 定义为“键”的列表,并且效果很好。

示例:

= 
Table.Group(
   Source,
   GroupColumns,
   {{
    "Sales (M€)", each List.Sum([#"Sales (M€)"]), type number}, 
    {"Sales (Qty MU)", each List.Sum([#"Sales (Qty MU)"]), type number}
   })

我定义了一个名为 SumColumns 的列表:

SumColumns = {"销售额 (百万欧元)","销售额 (数量 MU)"}

现在我找不到创建列表的语法,该列表将根据 SumColumns 列表动态创建我想要的所有列。

我以为我会在这里得到答案,但我不明白“LocalContext”部分:如何在 PowerQuery 查询中正确使用 table.group 来动态汇总不同的行和列?

我试过这个:

= Table.Group(
    Source,
    {GroupColumns},
    {{
        SumColumns,
        (LocalContext) => List.Sum(Table.Column(LocalContext, SumColumns)),
        type number
    }}
)

但是我收到错误“无法将列表类型的值转换为文本类型”

我尝试通过“unpivot”来实现这一点,但是当我想将属性转回到列时,我遇到了同样的问题,而且无论如何它都会慢得多。

有什么想法吗?

谢谢

奥雷利恩

dynamic group-by powerbi powerquery m
2个回答
5
投票

尝试跟踪环境上下文确实有点令人困惑。

这个问题比我在您链接的帖子中的答案更进一步,因为我们有多个列,而不仅仅是一个列。因此我们需要生成列表

{
    {"Sales (M€)", each List.Sum([#"Sales (M€)"]), type number}, 
    {"Sales (Qty MU)", each List.Sum([#"Sales (Qty MU)"]), type number}
}

仅从列表中

SumColumns = {"Sales (M€)", "Sales (Qty MU)"}

规则是我们需要将列

C
替换为包含
C
、函数和类型的列表。即,

C --> {C, function, type}

为此,我将在

List.Transform
上使用
SumColumn
,其中第二个参数是定义所需转换的函数。

List.Transform(SumColumns, (C) => {C, each List.Sum(Table.Column(_, C)), type number})

在此表达式中,

C
代表列名称,
_
代替我们从中选取列
C
以便求和的子表。

将其放入您的查询中,如下所示:

Table.Group(
    Source, 
    GroupColumns,
    List.Transform(SumColumns, (C) => {C, each List.Sum(Table.Column(_, C)), type number})
)

这假设

GroupColumns
是列列表。

请注意,这次我选择使用

each _
(相当于
(_) => _
)结构,但我可以写得更类似于我之前的做法,以强调捕获本地上下文。

Table.Group(
    Source, 
    GroupColumns,
    List.Transform(
        SumColumns,
        (C) => {C, (LocalContext) => List.Sum(Table.Column(LocalContext, C)), type number}
    )
)

注意:在这两个匿名/lambda 函数定义中,

C
LocalContext
本质上是我碰巧选择的变量名称。它们不是任何类型的关键字或内置函数。


0
投票

Expression.Error:无法识别名称“GroupColumns”。确保拼写正确。

尝试合并一组列中的数据时出现上述错误

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.