Excel PowerQuery/M:如何将多行文本合并到一行中

Excel PowerQuery/M:如何将多行文本合并到一行中,excel,powerbi,powerquery,m,Excel,Powerbi,Powerquery,M,我在PowerQuery中有这样一个表: # 凯亚 钥匙 评论 价值 1. A1 地下一层 评论1 1. 2. A1 地下一层 评论2 3. 3. A2 地下二层 评论3 6. Table.Group正在做需要做的事情 以下是问题的解决方案: let Source = Table.FromRecords({ [KeyA="A1", KeyB="B1", Comment="Comment 1", Value=1],

我在PowerQuery中有这样一个表:

# 凯亚 钥匙 评论 价值 1. A1 地下一层 评论1 1. 2. A1 地下一层 评论2 3. 3. A2 地下二层 评论3 6.
Table.Group
正在做需要做的事情

以下是问题的解决方案:

let
    Source = Table.FromRecords({
        [KeyA="A1", KeyB="B1", Comment="Comment 1", Value=1], 
        [KeyA="A1", KeyB="B1", Comment="Comment 2", Value=2], 
        [KeyA="A2", KeyB="B2", Comment="...", Value=3]
     }),
    Grouped = Table.Group(
        Source,
        {"KeyA", "KeyB"},
        {
            {"Comments", (t) => Text.Combine(t[Comment], ", ")}, // <- Magic happens here!
            {"Sum", (t) => List.Sum(t[Value])},
            {"RecordCount", each Table.RowCount(_), Int64.Type}
        }
    )
in
    Grouped
let
Source=表.FromRecords({
[KeyA=“A1”,KeyB=“B1”,Comment=“Comment 1”,Value=1],
[KeyA=“A1”,KeyB=“B1”,Comment=“Comment 2”,Value=2],
[KeyA=“A2”,KeyB=“B2”,Comment=“…”,Value=3]
}),
分组=表。分组(
来源:,
{“KeyA”,“KeyB”},
{
{“Comments”,(t)=>Text.Combine(t[Comment],“,”)},//List.Sum(t[Value]),
{“RecordCount”,每个表.RowCount(_),Int64.Type}
}
)
在里面
分组
说明: 该功能需要3个参数:

  • 源数据
  • 应用于分组的列的列表
  • 生成新聚合列的函数列表
  • 最后一个参数是键,也是power函数的作用:PowerQuery在内部调用这些函数中的每一个,并提供一个表作为参数,其中包含一个组的所有行。如何使用它完全取决于您,即您可以使用List.Sum、Avg、…-但您也可以对表进行任何其他修改

    条目
    {“Comments”,(t)=>Text.Combine(t[Comment],“,”)}
    创建一个新列
    Comments
    (t)=>…
    是函数定义。为每个组调用此函数-使用包含该组所有行的表
    t[Comment]
    将表中的
    Comment
    列提取为列表,然后可与
    列表一起使用。组合
    函数以连接

    如何从PowerQuery编辑器开始 如果在PowerQuery编辑器中有源表,请选择列
    KeyA
    KeyB
    ,然后单击变换功能区中的“分组依据”。这将使用记录计数构建
    表.Group
    查询。使用高级编辑器进行进一步修改


    表格。Group
    正在做所需的事情

    以下是问题的解决方案:

    let
        Source = Table.FromRecords({
            [KeyA="A1", KeyB="B1", Comment="Comment 1", Value=1], 
            [KeyA="A1", KeyB="B1", Comment="Comment 2", Value=2], 
            [KeyA="A2", KeyB="B2", Comment="...", Value=3]
         }),
        Grouped = Table.Group(
            Source,
            {"KeyA", "KeyB"},
            {
                {"Comments", (t) => Text.Combine(t[Comment], ", ")}, // <- Magic happens here!
                {"Sum", (t) => List.Sum(t[Value])},
                {"RecordCount", each Table.RowCount(_), Int64.Type}
            }
        )
    in
        Grouped
    
    let
    Source=表.FromRecords({
    [KeyA=“A1”,KeyB=“B1”,Comment=“Comment 1”,Value=1],
    [KeyA=“A1”,KeyB=“B1”,Comment=“Comment 2”,Value=2],
    [KeyA=“A2”,KeyB=“B2”,Comment=“…”,Value=3]
    }),
    分组=表。分组(
    来源:,
    {“KeyA”,“KeyB”},
    {
    {“Comments”,(t)=>Text.Combine(t[Comment],“,”)},//List.Sum(t[Value]),
    {“RecordCount”,每个表.RowCount(_),Int64.Type}
    }
    )
    在里面
    分组
    
    说明: 该功能需要3个参数:

  • 源数据
  • 应用于分组的列的列表
  • 生成新聚合列的函数列表
  • 最后一个参数是键,也是power函数的作用:PowerQuery在内部调用这些函数中的每一个,并提供一个表作为参数,其中包含一个组的所有行。如何使用它完全取决于您,即您可以使用List.Sum、Avg、…-但您也可以对表进行任何其他修改

    条目
    {“Comments”,(t)=>Text.Combine(t[Comment],“,”)}
    创建一个新列
    Comments
    (t)=>…
    是函数定义。为每个组调用此函数-使用包含该组所有行的表
    t[Comment]
    将表中的
    Comment
    列提取为列表,然后可与
    列表一起使用。组合
    函数以连接

    如何从PowerQuery编辑器开始 如果在PowerQuery编辑器中有源表,请选择列
    KeyA
    KeyB
    ,然后单击变换功能区中的“分组依据”。这将使用记录计数构建
    表.Group
    查询。使用高级编辑器进行进一步修改


    Related:Related:GroupBy的精彩解释。对于复杂的聚合,是在GroupBy函数中执行此操作更有效(执行速度更快),还是在GroupBy“所有行”中执行此操作,然后添加自定义列。在VBA中,我可以使用高分辨率计时器来比较不同的处理方式。@RonRosenfeld-那么您的意思是只在
    表中添加一列,其中包含每个组的所有行。group
    函数-然后作为下一步单独进行其他聚合?我没有对它进行测量,但凭直觉,我认为在
    函数中进行所有操作应该更有效……在
    函数中进行操作肯定是更整洁的编程。但另一种方法是,对于没有内置到UI中的聚合,是我在尝试使用PQ时第一次遇到的方法。但我不知道在编译代码的过程中幕后发生了什么,也不知道有什么方法可以度量这类事情的执行时间。@RonRosenfeld关于性能度量:对于PowerBI,签出Excel您可以使用VBA方法并刷新连接-根据查询的运行时间,可能必须在一次测量期间多次执行此操作。只需确保连接的“后台刷新”被禁用(默认情况下处于打开状态),这正是我想要的。谢谢。GroupBy的精彩解释。对于复杂的聚合,是在GroupBy函数中执行此操作更有效(执行速度更快),还是在GroupBy“所有行”中执行此操作,然后添加自定义列。在VBA中,我可以使用高分辨率计时器来比较不同的处理方式。@RonRosenfeld-那么您的意思是只在
    表中添加一列,其中包含每个组的所有行。group
    函数-然后作为下一步单独进行其他聚合?我没有测量它,但是直觉