Excel动态库存计算有妙招,不是一个SUMIFS吗

职场   2024-05-15 00:29   江苏  
最近我们练习了不少PQ习题,其中我两次用了类似于字典的功能,今天我们就来跟大家交流一下!

▍PQ中的字典

大部分编程语言包括VBA都有Key-Value 存储数据的容器大家比较熟悉的就是VBA中的字典PQ中也有对应,那就是record,我们简单看一下基础用法

下面就是PQ中的record表示方法,方括号中,key=value 来表示!多个使用逗号分隔!

使用& 可以新增或者更新“键值对”!下面简单演示!当然这是一些基础操作,如果key是来源其他字符又该怎么办呢?不用担心,record类相关操作函数虽然没有list多,但是常见的需求完全可以实现!



下面我们看一个学习圈的实战案例!

▍实战案例

比如想计算每种产品的当前库存!就需要每种商品的累计构建-累计销售!
一般的思路就是筛选,然后求和,再计算差额!但是数据量大,SelectRows效率堪忧!

下面我们简化一下这个案例,方便说明,关于这个案例的完整解法,请看文末完整的M函数代码!


导入到PQ编辑器,下面我们先看一下代码,简单说一下处理思路!

第一步,我们把每行转出记录,方便我们遍历取数,当然也可以转list!这个看大家习惯,异曲同工!
   
第二步,我们遍历这个list,逐行处理。这里要说一下核心思路,处理计算购进-销售,同时把商品名称作为key,检查一下字典中,是否已经存在这个商品,如果已经存在,直接取出+当前差额,更新对应商品库存即可,如果没有也就是首次,给0+当前差额。逻辑一致!下面我们来看一下如何实现!整个过程,我们都需要上次的计算结果,所以一个想到的就是要使用List.Accumulate函数

M函数如下,未做简化,第二参数中,第一个元素用来存放每种商品的更新后的库存,第二个元素是一个列表,用来存放添加库存后的当前行数据!最后转出表!
= Table.FromRecords(  List.Accumulate(第一步,{[],{}},(x,y)=>  [ 差额 = y[购进]-y[销售],    上次库存 = Record.FieldOrDefault(x{0},y[商品],0),    更新库存 = Record.AddField([],"库存",上次库存+差额),    更新结果 = {      x{0} &  Record.AddField([],y[商品],上次库存+差额),      x{1}&{y & 更新库存}     }   ][更新结果]){1})

▼点击放大查看原图


只有直接在编辑栏书写,未格式化,为了提高可读性,我已经使用了中文变量,方便大家理解!

其中两个函数:
1、Record.FieldOrDefault 可以获取对应key的value,没有可以指定默认值
2、Record.AddField,可以处理key是文本的情况,创建record ,更新等知识前面基础已讲解就不再啰嗦!


下面我们贴一下第一个实战案例中的完整M代码!已添加了说明!


当然,我在案例解析的时候也给了筛选的处理方案!

PQ从入门到精通,原本属于长期会员专属教程,一直有朋友希望我单独分离出来,方便有只想学习PQ的同学购买,现在就尝试独立,目前尝试分离,有需要的朋友,可以加 微 yianxss 了解!今天的内容就这里!



Excel办公实战
Excel函数、VBA、PBI等全系列教程第一人。助你轻松实现办公自动化!宗旨:易办公◎早下班!
 最新文章