看这样一个题目:将上表转换成下表
咋一看,还以为就是一个表格转置的问题,仔细看看,才发现原来中间还是有些曲折:
- 要把项目列展开到日期
- 要把日期变成列
在Power Query中解决问题的方法有很多种,我们今天就从表格变换的角度来思考一下这个问题,针对这个问题,应该分三步走:
- 第一步:数据整理,现有的数据格式逆透视变成一维数据格式
- 第二步:分出单表,每个日期一个表
- 第三步:合并这些表格
第一步:数据整理
数据整理的过程,我们就会发现很多问题,当我们完成逆透视之后,就会发现,这个表格中同一日期下对应着12个项目1,将来我们合并表格时没有准确的索引,所以我们需要按照日期分组添加一个索引:
然后我们合并属性与索引作为我们合并表格的键值:
到这一步我们的数据整理就做好了。
第二步:拆分表格
这一步的方法有多,最常用的就是Table.Group,根据日期分组,得到31个表格,当然我们也可以换种思路,我们用筛选的方法也可以达成同样的效果,用Table.SelectRows来获得每个日期对应的表格,当然要用List.Transforn做个循环,拆分出每个表格。
我们在拆分的同时删除了日期列,并且用日期给数值列重命名。
let
T=Table.Buffer(S),
源 = List.Transform(
List.Distinct(T[日期]),
(x)=> Table.RenameColumns(
Table.RemoveColumns(
Table.SelectRows(T, each ([日期] = x)),
{"日期"}),
{{"值", Text.From(x)}}))
in
源
- S:是我们整理好的数据源。
- T=Table.Buffer(S):把数据源表缓存,因为我们要重复使用这个表。
- List.Transform的第一参数是数据源中日期列去重复之后的日期列表,第二参数就是用Table.RenameColumns、 Table.RemoveColumns、Table.SelectRows函数组合,筛选表格、删除列、重命名列。
第三步:合并表格
整体合并之前我么要做个实验,为了确保数据不遗漏,我们取了两个日期的表格,10月2日266行,10月31日418行,如果他们的表键值完全相同,合并结果应该是418行。
Table.NestedJoin就有点类似Excel中的VLOOKUP函数,我们根据a列的值来匹配数据,JoinKind.FullOuter合并类型是取两个表的所有行,这样就确保了数据的完整性。
我们展开之后得到的是418行:
有了这个测试结果,我们就可以开始完成表格合并了:
我们选用List.Accumulate函数来做最终的表格合并
- 第一参数:就是我们拆分好的表格列表
- 第二参数:第一个表,2019/10/1日期对应的表
- 第三参数:用Table.NestedJoin函数合并x,y 表
这个是把拆分表的公式都带进来的一个公式,看起来有点乱,后面几步就是为了拆分列,把之前添加的索引去掉。重新排列的结果如下: