如何对不同行,同列名进行多维转一维?

2020-03-24 15:47:51 浏览数 (1)

之前的案例都是列数及行数相同,那如果是不同的情况下,该如何处理呢?

原表:

目标表:

此时我们可以通过另外一个分组函数来进行处理。Table.Group

代码语言:javascript复制
Table.Group(table as table,   //需要操作的表
            key as any,       //分组关键词
            aggregatedColumns as list,   //分组后的新列名及计算公式
            optional groupKind as nullable number,  //全局分组或者是局部分组
            optional comparer as nullable function) as table  //局部分组使用到的函数
  • 第一个必填参数:我们很好理解,是从哪个表进行操作。
  • 第二个必填参数:是根据哪列数据进行分组,可以为文本格式及列表格式。参数必须要填写,但是可以是空列表{},只有在不需要值来计算时可以使用。同时如果是列表格式,则第4参数默认为全局分组。
  • 第三个必填参数:怎么进行分组操作,是一个列表格式。
  • 第四个可选参数:1=全局分组;0=局部分组(分组到下一条不等值为止)
  • 第五个可选参数:目前所知是有2个参数组成的函数(x,y)其中X为每次分组后的第一行;Y为X当前行及下面的每一行。通常用(x,y)=>Number.From()固定格式来处理所判断后的条件值。

(一) 通过增加列来判断分组的依据。

代码语言:javascript复制
if Text.Contains([列1],"班") then 1 else null

解释: 判断列1是否包含班的关键词,如果有就标记1,没有就空着。主要是为了之后的分组作为依据。

(二) 根据分组依据分割成各个表格

代码语言:javascript复制
Table.Group(已添加自定义, 
            "自定义", 
           {"计数", each _},
            0,
           (x,y) => Number.From(y=1)
           )

解释: 判断从1开始直到下一个为1之前的作为一个表来进行分组。

(三) 对分组后的表进行转置

可以通过添加列,也可以在之前分组的时候进行处理。

代码语言:javascript复制
Table.Group(已添加自定义, 
           "自定义",              //不能是列表格式,列表格式局部分组就无意义
           {"计数", each Table.Transpose(_)},  //转置表并显示增加的列名
           0,                     //局部分组
           (x,y)=>Number.From(y=1)
            )
Table.AddColumn(分组的行, "自定义.1", each Table.Transpose([计数]))

(四) 保留所需要的数据并展开

(五) 最后添加班级并向下填充以及重命名标题及筛选后得出最后结果。

这里留个疑问,因为目前来看,列名都是一一对应的,如果列名不一致的话,如何进行处理呢?可以先行试着操作下。

原表:

目标表:

案例模拟文件下载http://gofile.me/4KHV7/SUo5ywXxC 试试看能不能得出效果呢? 如果用之前的方式,我们不能把相同项目归类在一起,得到的错误结果是这样的。

如果觉得有帮助,那麻烦您进行转发,让更多的人能够提高自身的工作效率。

0 人点赞