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

Aur*_*nDW 2 group-by dynamic m powerquery powerbi

为了达到我的目标,我奋斗了几个小时。

\n

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

\n

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

\n

例子:

\n
= \nTable.Group(\n   Source,\n   GroupColumns,\n   {{\n    "Sales (M\xe2\x82\xac)", each List.Sum([#"Sales (M\xe2\x82\xac)"]), type number}, \n    {"Sales (Qty MU)", each List.Sum([#"Sales (Qty MU)"]), type number}\n   })\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

SumColumns = {"销售额 (M\xe2\x82\xac)","销售额 (数量 MU)"}

\n

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

\n

我以为我会在这里得到答案,但我不明白“LocalContext”部分:How do Iproperly use table.group in a PowerQuery query todynamicly summar不同的行和列?

\n

我试过这个:

\n
= Table.Group(\n    Source,\n    {GroupColumns},\n    {{\n        SumColumns,\n        (LocalContext) => List.Sum(Table.Column(LocalContext, SumColumns)),\n        type number\n    }}\n)\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

\n

有任何想法吗?

\n

谢谢

\n

奥雷利安

\n

Ale*_*son 5

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

\n

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

\n
{\n    {"Sales (M\xe2\x82\xac)", each List.Sum([#"Sales (M\xe2\x82\xac)"]), type number}, \n    {"Sales (Qty MU)", each List.Sum([#"Sales (Qty MU)"]), type number}\n}\n
Run Code Online (Sandbox Code Playgroud)\n

仅从列表来看

\n
SumColumns = {"Sales (M\xe2\x82\xac)", "Sales (Qty MU)"}\n
Run Code Online (Sandbox Code Playgroud)\n

规则是我们需要用C包含C、函数和类型的列表替换列。IE,

\n
C --> {C, function, type}\n
Run Code Online (Sandbox Code Playgroud)\n

为此,我将使用List.Transformon SumColumn,其中第二个参数是定义所需转换的函数。

\n
List.Transform(SumColumns, (C) => {C, each List.Sum(Table.Column(_, C)), type number})\n
Run Code Online (Sandbox Code Playgroud)\n

在此表达式中,C代表列名称并_取代我们C从中选取列以进行求和的子表。

\n

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

\n
Table.Group(\n    Source, \n    GroupColumns,\n    List.Transform(SumColumns, (C) => {C, each List.Sum(Table.Column(_, C)), type number})\n)\n
Run Code Online (Sandbox Code Playgroud)\n

这假设GroupColumns是一个列列表。

\n

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

\n
Table.Group(\n    Source, \n    GroupColumns,\n    List.Transform(\n        SumColumns,\n        (C) => {C, (LocalContext) => List.Sum(Table.Column(LocalContext, C)), type number}\n    )\n)\n
Run Code Online (Sandbox Code Playgroud)\n
\n

注意:在这两个匿名/lambda 函数定义中,CLocalContext本质上都是我碰巧选择的变量名称。它们不是任何类型的关键字或内置函数。

\n