多列转置的难题,PowerQuery+函数轻松搞!

职场   2024-11-10 23:41   江苏  
啥也不说了,直接来看问题吧!这个是一位网友的问题改编,具体看下图


问题比较常用,主要是这样登记是给人看的,但是统计分析非常不方便,所以需要转换为一维表,也就是下面的样子,我们一起交流一下函数和PQ的处理方案,VBA视频再讲解吧!

▍函数解法

具体公式我们先给一下,看上去有点长,不用担心,听完思路你就豁然开朗了!
▼函数公式
=REDUCE({"货号","颜色","尺码"},B2:B3,LAMBDA(x,y,LET(_L,OFFSET(y,,,,-2),_C,TOCOL(OFFSET(y,,1,,99),3),VSTACK(x,IFNA(HSTACK(_L,_C),_L)))))


下面我们说说思路:
我们拿第一行来说明。思路的核心是容错填充,继续往下看!

①尺码转置

根据结果,我们需要尺码转置成一列,所以我们使用TOCOL,转成列,同时忽略控制,这里由第三参数3控制!


下面就是思路的核心

②容错填充!


当我们把一行多列和一列多行的内容左右对接后,会形成下面的样子!
一行的列数不够,都是#NA错误


我们可以使用IFNA函数做容错处理,出错了,我们继续用一行内容填充!

没错,就是这么简单!

其他就是用循环函数REDUCE,把每一行都处理一下,没错结果使用VSTACK上下堆起来即可!

下面我们看一下Power Query这个数据清洗神器,如何解决这个问题,非常简单!

▍Power Query解法

PQ解法也是比较简单的,下面是PQ中的M函数写法,一句搞定!
▼PQ-M函数
= Table.Combine(List.Combine(Table.ToList(源,each List.Transform(List.RemoveNulls(List.Skip(_,2)),(x)=>#table(3,{List.FirstN(_,2)&{x}})))))


我们还是分享一下思路,这个才是核心!
这里我们采用的是遍历尺码构建表,再合并的思路!具体看一下细节分析!

1、Table.ToList,可以把每一行转成一个List,前两个是固定,后面是尺码,所以用List.Skip跳过两个元素,得到尺码在通过List.Transform这个尺码遍历处理,处理的过程就是利用前面的货号和颜色+尺码构建一行的表

2、最后把每一行的转换结果通过List.Combine,合并成一个大的List,List中的每个元素就是一个尺码对应的一行表,然后通过Table.Combine合并成一个大表

当然,你也可以先转List,最后一次性构建表,比如使用Table.FromRows都是可以的!

以上就是今天的案例分享来,标星,点击头像,可以连续学习2200+的原创文章,包含函数、技巧、图表可视化、VBA、PQ、PBI、Py

Excel办公实战
分享Excel及WPS函数、技巧、VBA、PBI、JSA等办公技能。助你轻松实现办公自动化!易办公◎早下班!
 最新文章