Power Query:Table.Group 具有聚合列的动态列表
Power Query: Table.Group with a dynamic list of aggregated columns
为达到我的目标而奋斗了几个小时。
objective是在使用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 = {"销售额 (M€)","销售额 (MU)"}
现在我找不到创建列表的语法,该列表将根据 SumColumns 列表动态创建我想要的所有列。
我以为我会在这里得到答案,但我不明白“LocalContext”部分:
我试过这个:
= Table.Group(
Source,
{GroupColumns},
{{
SumColumns,
(LocalContext) => List.Sum(Table.Column(LocalContext, SumColumns)),
type number
}}
)
但我收到错误消息“无法将 List 类型的值转换为 Text 类型”
我尝试通过“unpivot”来解决这个问题,但是当我想将属性回转到列时我遇到了同样的问题,而且速度会慢得多。
有什么想法吗?
谢谢
奥雷连
尝试跟踪环境上下文确实有点混乱。
这个问题比我在您链接的 post 中的回答更进一步,因为我们有多个列,而不仅仅是一个列。因此我们需要生成列表
{
{"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}
为此,我将在 SumColumn
上使用 List.Transform
,其中第二个参数是定义所需转换的函数。
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}
)
)
注意:在这两个anonymous/lambda函数定义中,C
和LocalContext
本质上是我碰巧选择的变量名。它们不是任何类型的关键字或内置函数。
为达到我的目标而奋斗了几个小时。
objective是在使用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 = {"销售额 (M€)","销售额 (MU)"}
现在我找不到创建列表的语法,该列表将根据 SumColumns 列表动态创建我想要的所有列。
我以为我会在这里得到答案,但我不明白“LocalContext”部分:
我试过这个:
= Table.Group(
Source,
{GroupColumns},
{{
SumColumns,
(LocalContext) => List.Sum(Table.Column(LocalContext, SumColumns)),
type number
}}
)
但我收到错误消息“无法将 List 类型的值转换为 Text 类型”
我尝试通过“unpivot”来解决这个问题,但是当我想将属性回转到列时我遇到了同样的问题,而且速度会慢得多。
有什么想法吗?
谢谢
奥雷连
尝试跟踪环境上下文确实有点混乱。
这个问题比我在您链接的 post 中的回答更进一步,因为我们有多个列,而不仅仅是一个列。因此我们需要生成列表
{
{"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}
为此,我将在 SumColumn
上使用 List.Transform
,其中第二个参数是定义所需转换的函数。
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}
)
)
注意:在这两个anonymous/lambda函数定义中,C
和LocalContext
本质上是我碰巧选择的变量名。它们不是任何类型的关键字或内置函数。