分组时需要求和的数据有几十列,有快捷方法吗?

2021-08-30 14:28:59 浏览数 (1)

- 1. 问题 -

在我以前的文章中,涉及分组依据操作的内容,需要聚合(求和等)的列通常不会太多,因此,手工操作一下也很快,但有朋友还是碰到了需要对几十列进行求和的问题,这个时候,如果还是手工一项项地设置的话,的确会有点儿烦。

- 2.思路 -

首先,如果一时没想到快捷的方法,而工作上又要马上出数据,那就直接手工操作,其实即使几十列也不见得要很久(虽然比较烦,但是,在实际工作中,对于很多简单的操作问题,如果也不是经常会碰到,那么动起手来马上解决问题比花时间和精力想出更好的解决办法再去做,可能更加快捷有效)。

当然,如果经常会碰到,那必须学习更加有效的解决办法。

再回到这个问题,实际就是怎么在分组时,实现批量处理的问题,下面直接通过一个简单的例子来进行说明(数据就不造几十列的了,不然不知道该怎么截图,用下面的方法,两列跟几十列是一样的)。数据如下,针对“订单ID”分组,对“数量”和“金额”等字段进行求和:

Step 01 分组生成一个求和项

这个时候,我们来看一下其生成的步骤代码是什么样子的:

显然,对于Table.Group函数来说,它是通过一个嵌套的列表(聚合参数)来控制聚合(如求和)项的输出的,如果只有一个聚合项,那么其中就是一个列表元素,如其中的{"数量", each List.Sum([数量]), type number}。

因此,如果我们可以针对多个元素批量生成这个列表,那么就可以实现批量的聚合处理,既然要批量生成列表,那最常用的函数自然是List.Transform。

Step 02 修改函数中的聚合参数

将其中通过手工操作生成的固定列表改为用List.Transform函数批量生成的列表,修改后如下所示(为方便截图对公式进行了换行处理,红色框内为修改的内容):

代码语言:javascript复制
= Table.Group(更改的类型, {"订单ID"}, 
      List.Transform(
         {"数量","金额"},
         (s)=>{s, each List.Sum(Table.Column(_,s)), type number}
      )
  )

公式要点:

1、通过List.Transform函数将要批量求和的列名转换为分组依据函数所接受的聚合参数列表格式;

2、其中要注意的是,原List.Sum([数量])内需要引用的是需要求和的列的数据,而不是列名本身,即不是List.Sum("数量"),因此,需要通过Table.Column函数来通过列名获得该列的数据

3、关于List.Transform函数的具体用法,请参考文章《PQ-M及函数:批量处理的利器——列表转换函数(List.Transform)及A股数据批量抓取方法》。

- 3. 问题还没完 -

通过上面的修改,我们实现了将列名列表转换成了分组函数里的聚合参数列表,但是,有几十列,如果手写几十个列名也够烦的,而且都得加上双引号!

所以,我们要想办法怎么方便地把这个表的所有列名生成带双引号的列名列表,这样的话,我们要哪些就直接复制(或全部复制后删掉不需要的)。

首先,如果是在Excel里面,我们拿所有列名来造这个列表的方法很多,也不复杂,但是,既然在Power Query里,那么我们就用Power Query的方法来解决。直接加一个步骤(用完再删掉,单击编辑栏左侧的fx按钮可直接添加步骤公式),如下图所示:

代码语言:javascript复制
= Text.Combine(
      List.Transform(
         Table.ColumnNames(源), 
         each """"&_&""""
      ), ","
  )

公式要点:

1、通过Table.ColumnNames函数取得表中所有列的列名;

2、通过List.Transform函数对列名进行转换,即加上双引号;

3、通过Text.Combine函数对加了双引号的列名进行合并;

4、注意加双引号的用法(四个双引号)。

得到了这个列名的信息,就可以按需要拷贝其中的内容放到前面分组里改好的公式里了,不再赘述。

0 人点赞