有朋友在微信公众号的后台发消息提问:怎么同时对两列合并的文本进行逆透视?
看到这个问题,我一时竟无言以对……
后来,在群里看到的数据是这样的:
要求是这样子的:
这不叫逆透视啊!什么是透视?什么是逆透视?看图:
逆透视是多列(列名)都逐个放到行里变明细数据哦,而上面想要的结果列和原始数据的列是一毛一样的,只是要把列里面的内容拆分、配对展开……
数据简化模拟如下:
所以,首先第一步,不管怎么着,先把列给拆分了,但是,这里不好用拆分列的功能来做,为什么?
1、不能拆分到行:因为要分别对两列的内容进行拆分且找配对关系,先拆任何一列都会使配对关系丢失;
2、不能拆分到列:因为要拆分的内容的项数是不固定的。
所以,只好考虑用函数(Text.Split)先分别拆成列表放着,后面再想办法配对到一起。
- 1 - 拆分内容
Step 01:用函数拆分列
同样拆分“序号”列,得到结果如下(现在先讲分步解法,怎么综合各步骤函数一条公式搞定的事情等会儿再讲):
- 2 - 内容配对
都拆分好之后,面临的最关键问题就是怎么把两边的内容给配对好,对于这一点,有个很有意思的函数,而且这个函数本身就是一种处理数据的思路——List.Zip,我把它叫做“拉链”函数。
轻松简单就把两个列表里的内容一项项对应好,拉到一起,超级形象!看完这个例子,我希望你对这个函数终生难忘。
这里要注意且比较容易犯错误的是,List.Zip的参数是一个列表,也就是要将多个需要配对的列表放到一个列表一起交给List.Zip,所以好好看看上面例子的里外加的那对红色大括号,好好理解一下。
有了这样的函数,问题就很简单了。
Step 02:添加自定义列,把两列拆分出来的内容直接拉到一起
内容配对好后,就可以层层展开了……
- 3 - 内容展开
Step 03:第一次展开,扩展到新行(因为不同的配对内容是要拆到多个行的)
Step 04:第二次展开,提取值(因为配对好的内容本身是要在同一行里的,分隔符按需要选择即可,后面拆分列时用,这里选择空格)
Step 05:提取出来后,再按前面选择的分隔符简单分列即可
最后,关于怎么综合各步骤函数一条公式搞定的事情,先看个图: