【问题标题】:Power Query: Table.Group with a dynamic list of aggregated columnsPower Query:具有聚合列动态列表的 Table.Group
【发布时间】:2020-12-18 09:02:42
【问题描述】:

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

目标是在使用 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”部分:How do I properly use table.group in a PowerQuery query to dynamically summarize different rows and columns?

我试过了:

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

但我收到错误“无法将 List 类型的值转换为 Text 类型”

我尝试通过“unpivot”来解决问题,但是当我想将属性转回列时遇到了同样的问题,而且速度会慢得多。

有什么想法吗?

谢谢

欧瑞莲

【问题讨论】:

    标签: dynamic group-by powerbi powerquery m


    【解决方案1】:

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

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

    {
        {"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}
        )
    )
    

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

    【讨论】:

    • 下次我会尝试添加更多上下文,您的回答很清楚非常感谢!它第一次奏效!这个公式也有助于将列的变量列表作为键和聚合来处理,太棒了!
    猜你喜欢
    • 2019-05-13
    • 2020-05-31
    • 1970-01-01
    • 2021-02-18
    • 1970-01-01
    • 1970-01-01
    • 2014-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多