正文:
今天给大家分享一下,在PQ时分组的一些玩法。
案例一:
关于分组的玩法我收集了几个案例,往后会一个个写出来,今天会先来点简单的。
要求:
左表的数据转换成右表的结构。
这个问题如果写VBA来处理也不难,判断装数组再join一下,应该就可以了,我们今天来用Power Query来处理下。
= Table.Group(源,"类型",{"a",each Text.Combine([值],",")})
老规矩先上代码。
额。。。这时候你可能会想,大叔,你代码是不是复制少了,这么复杂的问题,你怎么就这么丁点代码?!!实际上就这么一行代码就可以解决,是不是惊呆了,嘻嘻!!
解答:
下面我们简单的看看,这个分组函数的说明。
第一参数是表,第二参数是你要分组的列名,第三参数可以理解为处理方式。第四,第五参数放在后面再讲。
华丽的分割线。
案例二:
来个综合的实战案例。
要求:
有接触过装修类或者工程类工作的朋友应该有经验。很多时候做一个工程会用同一种材料,但会用在不同的地方。但是往往我们要在采购材料之前先计算好用量。
左表是一张数据表,序号里的一..二..三代表不同的项目,数量列里记录的是项目里字项目的用量,有些数据是直接记录用量,有些数据记录的是用量的计算方法,比如(8.6*0.18)。最终我们最后要计算出每一个项目的总用量。
let
源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
a = Table.Group(
Table.FillDown(源,{"序号"}),"序号",
{"a",each Expression.Evaluate(
Text.Combine(
List.Transform(List.Select([数量],(x)=> x<>null),each Text.From(_)),"+"
)
)
}
)
in
a
既然要统计分组的数据,那么同样的套路,第一步用Table.Group就肯定没有错。注意,因为数据源的序号列只有第一行有数据,所以我们要先对序号列进行向下埋充处理。处理后再作为Table.Group的第一参数。
接下来我们要对第三参数里的自变量作处理,先要把不为null的数据提取出来。List.Select([数量],(x)=> x<>null)这里担心内层的自变量跟外层的有冲突,所以我这里先把内层的定义成x。
现在好像只要把List里面的值全部加起来就能达到我们想要的效果,问题就是要怎样加,我想到的是Expression.Evaluate,这个函数可以直接把带有公式的字符串直接运算并返回对应的结果,比如"1+2+3*4",可以直接得出15。
List里的数据转换成一串字符串,好不好处理,肯定好处理啊,直接外层套一个Text.Combine不就可以了吗,我当时是这样想的,逻辑上没问题,但是会出错,我们一起来看看。
出错原因也很简单,数值是不能直接合并的,要多走一步,把数值先换化成文本,再来合并应该就没问题了。
最后的最后,套上一层Expression.Evaluate,大功告成!!
感谢观看!!
剧透下期分享神奇的分组2,神秘的第四,第五参数会上场。
总结:
知识决定思路,以上仅为大叔个人解法,绝不是唯一解。欢迎各路大咖留言指点。
如果您没能看懂代码,也不要紧,因为目前国内会玩M语言的人并不算多,如果你对M感兴趣的话,建议您可以拜读一下施总的博客Power Query爱好者-pqfans_M语言学习资料_教程_分享_论坛_博客,是目前国内唯一一个可以免费学习到M的地方。
感谢观看,Thanks!