Excel之PowerQuery 连接日期分组的又一种方法
网友提问:将这张表

变成:

第1步:导入数据
【月】这个列,可能需要你修改一下数据类型
第2步:筛选月份
这一步的目的是,每个月份对应的日期,网友只提供了10月,但是既然有月份列,那肯定有还会有其它月。
第3步:修改列,提取具体天,转成数字

第4步:按考勤和项目分组
现在的x代表每一个Table


现在进入思考阶段:
【1】下面这种情况直接Table.Group第五参数搞定

除了这种方法还有其它方式,我们也讲过(不只这些,还有更多方法)
https://www.bilibili.com/video/BV12f4y1K7bD
【2】连续日期分组
在这里也讲过其中一种方法 https://www.bilibili.com/video/BV1cL4y1i7EH

【3】今天这个问题
如下图所示,添加索引列,计算差,利用Table.Group第4参数就可以搞定了


第5步:修改第4步公式,添加索引列
红框之内的公式代表每个Table

第6步:修改第5步公式,添加计算列
Table.AddColumn(表,"判断",(y)=>y[日期]-y[索引])
现在蓝色框代表每个Table

第7步:修改第6步公式,对每个Table中的判断列分组
= Table.Group(表,"判断",{"具体日期",each _},0)
现在绿色框代表每个Table
each后面的下划线代表每个Table里面的小Table,我们只需要每个小Table里面的【日期】列

现在each 后面的[日期] 代表【具体日期】那列的每个小List

我们需要将每个List中的最小值与最大值用“-”连接
按理说应该将[日期] 改成: List.Min([日期]) & "-" & List.Max([日期])
但是[日期]列为了刚才与索引计算已经改成数值类型了,我们要连接成字符还需要改回文本类型,于是写成:
Text.From(List.Min([日期])) & "-" & Text.From(List.Max([日期]))

接下来我们要取【数据】列每个Table的【具体日期】列
先找到谁是每个Table

再用 表[字段名] 的方式提取

现在我们要知道谁是数据列的每个List

我们要将每个List用顿号连接
Text.Combine({"1-7","15-16"},"、") 返回:"1-7、15-16"
Text.Combine(每个List,"、")

这时你会发现一个问题,就是当初[日期]列只有一个值时,因为我们取的是最小值连接最大值,就出现了现在的问题。

所以我们要判断一下,当List.Count([日期])>1时返回什么,否则返回什么
if List.Count([日期])>1 then Text.From(List.Min([日期])) & "-" & Text.From(List.Max([日期])) else Text.From(List.Min([日期]))

都写到这里了 ,我才发现网友还需要项目简称,在分组加上它就可以了

完成代码如下:
第8步:上载表格

第9步:动态筛选
随便找个地方,写上表头和月份

将其导入PowerQuery


然后我们到表1的筛选那一步修改数据,之前我们写成了固定的:"10月"

现在改成动态

上载表2,选仅创建链接即可。

完成了:以后修改月份,刷新左边的表即可。

本文章配套课件已经发到评论区了。

PowerQuery合集:https://www.bilibili.com/video/BV1oa4y1j75e

