已收录

库存够不够,AI一口气写了7种欠料公式,最快的94个字符

古哥计划
古哥计划 Lv.4 核心创作者KVP

Lv.4 核心创作者

做计划的人,谁没被这种表折磨过:左边一张产品×日期的需求二维表,右边一小块库存,领导问一句"这

四天哪些产品会欠料?欠多少?"

手算要一天一遍一遍扣,Excel里拉辅助列拉到怀疑人生。需求一变,全部重来。

我让AI来干。它一口气写了7种解法,最快的一个94个字符,还自己给每种打法打了速度分。

一、场景定义

原始数据长这样:一张需求二维表,产品A~D每天的需求量;旁边一张库存表,A有200,D有1400。

要的东西很简单:每个产品,每天还剩多少?负数就是欠料。

这个场景放哪个行业都成立:

  • 电子厂:物料欠料,停工等料一天损失几万

  • 食品厂:原料日耗,备多了过期备少了断货

  • 电商:库存扣减,超卖一个赔三倍

共同骨架一句话:库存 − 截至当天的累计需求 = 结余。

二、方法1:MMULT矩阵上三角(94字符,速度95分)

AI的思路很刁:不逐天循环,用列号生成一个上三角0/1矩阵,矩阵乘法一次把四天的累计需求全算出来,库存广播相减,完事。

公式:矩阵一次算累计

=LET(a,A2:A5,n,COLUMN(A:D),HSTACK(a,XLOOKUP(a,G2:G3,H2:H3,0)-MMULT(B2:E5,--(n>=TRANSPOSE(n)))))
  • n,COLUMN(A:D)

:列号1~4,同一个表达式用两次,按铁则提进LET

  • n>=TRANSPOSE(n)

:4×4上三角,真=1假=0,双负号转数值

  • MMULT(B2:E5,上三角)

:一步算出每行前c天的累计需求

  • XLOOKUP(a,G2:G3,H2:H3,0)

:库存广播,没有库存按0

  • 相减得结余,负数即欠料

限制:需求矩阵必须纯数值(逻辑值要双负号强转);上三角宽度要跟天数同步改;输出按产品源顺序不排序。

这个打法零LAMBDA零循环,10万行数据毫秒级。字符数从101压到94,就是靠LET把重复的列号提出来——又快又短,速度榜第一。

三、方法2:REDUCE横向递推(145字符,速度90分)

第二种是递推思路:以库存列当初值,循环天数列,每轮把"上一轮结果−当天需求"追加到右边,像滚雪球一样横向长出四列结余。

公式:库存当初始值滚动

=LET(a,A2:A5,s,XLOOKUP(a,G2:G3,H2:H3,0),HSTACK(a,DROP(REDUCE(s,SEQUENCE(,COLUMNS(B2:E5)),LAMBDA(x,c,HSTACK(x,TAKE(x,,-1)-INDEX(B2:E5,,c)))),,1)))
  • s

:XLOOKUP把库存按产品广播成4×1初始列

  • REDUCE(s,天数序列,...)

:循环4次,每次横向追加一列

  • TAKE(x,,-1)-INDEX(B2:E5,,c)

:上一轮末列减当天需求列

  • DROP(...,,1)

:掐掉初始库存列,只留结余

限制:需求列须连续区域;天数很多时HSTACK的矩阵复制开销会涨。

LAMBDA只调用天数次(4天就4次),10万行数据照样快,速度榜第二实至名归。

四、方法3:先累计再减(135字符,速度76分)

第三种换了条路:逐产品先算累计需求,再拿库存一次性减。SCAN里套内置的SUM求和,比LAMBDA自己相减快一截。

公式:先滚累计,一次相减

=LET(A,A2:A5,TAKE(HSTACK(A,XLOOKUP(A,G2:G3,H2:H3,0)-DROP(REDUCE("",A,LAMBDA(X,Y,VSTACK(X,SCAN(0,OFFSET(Y,,1,,4),SUM)))),1)),COUNTA(A)))
  • REDUCE("",A,...)

:逐产品压栈,VSTACK拼行

  • SCAN(0,需求行,SUM)

:从0起逐天累计,SUM是内置函数,解释成本低

  • XLOOKUP - 累计矩阵

:库存广播减累计

  • TAKE(...,COUNTA(A))

:掐头去尾取干净

限制:OFFSET是易失函数,全表重算会被拖慢;天数硬编码4,加天数要手改。

五、方法4:滚动递减(129字符,速度74分)

第四种跟方法3是亲兄弟:SCAN不从0起,直接拿库存当起点,逐日做减法——x-y滚下去,减完就是结余,连"库存减累计"那步都省了。

公式:库存起头逐日扣

=LET(a,A2:A5,HSTACK(a,DROP(REDUCE("",a,LAMBDA(X,Y,VSTACK(X,SCAN(XLOOKUP(Y,G2:G3,H2:H3,0),OFFSET(Y,,1,,4),LAMBDA(x,y,x-y))))),1)))
  • XLOOKUP(Y,...)

:当前产品的库存做SCAN初值

  • SCAN(初值,需求行,x-y)

:逐日滚动递减,减到哪算哪

  • VSTACK

逐产品拼行,DROP掐掉占位行

限制:同样吃OFFSET易失的亏;没库存的产品按0起算,第一天就是欠料。

六、方法5:TOCOL压平折回(195字符,速度60分)

第五种是降维打击:把二维需求压平成一列,一维算累计,算完再折回二维。

公式:压平→累计→折回

=LET(a,A2:A5,q,TOCOL(B2:E5),n,COLUMNS(B2:E5),HSTACK(a,WRAPROWS(XLOOKUP(TOCOL(IF(SEQUENCE(,n),a)),G2:G3,H2:H3,0)-SCAN(0,SEQUENCE(ROWS(q)),LAMBDA(x,i,IF(MOD(i-1,n)=0,INDEX(q,i),x+INDEX(q,i)))),n)))
  • TOCOL(B2:E5)

:16个需求压平成一列

  • SCAN+MOD分组

:序号对天数取余,余1时重置累计——每4个一组重新起头

  • WRAPROWS(...,n)

:一维结果按宽度4折回二维

限制:WRAPROWS固定宽度折回,要求产品行顺序整齐连续;每元素带MOD加两次INDEX,较重。

七、方法6:MAKEARRAY逐格算(134字符,速度40分)

第六种最直觉:造一个4×4的数组,每个格子独立算"库存−前c天累计"。

公式:按坐标逐格独立计算

=LET(a,A2:A5,q,B2:E5,HSTACK(a,MAKEARRAY(COUNTA(a),COLUMNS(q),LAMBDA(r,c,XLOOKUP(INDEX(a,r),G2:G3,H2:H3,0)-SUM(OFFSET(q,r-1,0,1,c))))))
  • MAKEARRAY(行,列,LAMBDA(r,c,...))

:按坐标逐格生成

  • SUM(OFFSET(q,r-1,0,1,c))

:取该行前c天求累计

限制:每格独立计算无共享,OFFSET还易失——10万行数据基本卡死,只适合小表。

八、方法7:FILTER条件取数(257字符,速度20分)

第七种最啰嗦但有个独门绝活:四列全部一维化(产品、需求、库存、累计),FILTER按产品条件取数,算完折回。

公式:一维化+条件筛选折回

=LET(p,TOCOL(IF(SEQUENCE(,4),A2:A5)),q,TOCOL(B2:E5),s,XLOOKUP(p,G2:G3,H2:H3,0),c,SCAN(0,SEQUENCE(ROWS(q)),LAMBDA(x,i,IF(MOD(i-1,4)=0,INDEX(q,i),x+INDEX(q,i)))),HSTACK(UNIQUE(p),TRANSPOSE(DROP(REDUCE("",UNIQUE(p),LAMBDA(X,Y,HSTACK(X,FILTER(s-c,p=Y)))),,1))))
  • 源表产品顺序乱了它也不怕,乱序鲁棒是唯一亮点

  • 代价:每个产品都要扫一遍全表,O(n²),10万行是分钟级灾难

九、方法对比排名

AI给7种打法打了速度分(算量实证,满分100):

排名

方法

长度

速度分

精简思路

1

方法1 MMULT

94

95

上三角矩阵一次算累计

2

方法2 REDUCE横向

145

90

库存当初值滚动追加

3

方法3 先累计再减

135

76

SCAN累计一次相减

4

方法4 滚动递减

129

74

库存起头逐日扣

5

方法5 TOCOL折回

195

60

压平累计再折回

6

方法6 MAKEARRAY

134

40

逐格独立计算

7

方法7 FILTER

257

20

条件取数乱序鲁棒

短的方法未必快,快的方法未必短。按数据脾气选:

十万行数据记住一句话:矩阵M乘是首选;要循环就用瑞丢斯少调几次;逐格和全表扫描是10万行杀手。

十、避坑清单

都是这次实测踩出来的:

  • TAKE的第三个参数在WPS云端失效

,TAKE(a,,6)返回的是第1列,取指定列老老实实用INDEX

  • PIVOTBY在云端ET直接罢工

,标准区域引用也报#VALUE!,别指望

  • GROUPBY多列逐列聚合结果错

,聚合函数吐数组直接#VALUE!;BYROW吐数组#CALC!——聚合三兄弟全灭

  • XLOOKUP查找值是二维数组时只返回首列

,老坑,两次实测都踩

  • FILTER+HSTACK拼列会转置错位

,拼完记得TRANSPOSE折回

  • 3D引用按工作表物理顺序取数

,表顺序一乱就丢表,显式一张张引用最稳

  • 同一表达式用两次就进LET

,不只是可读性,还能顺手压缩字符

最后说一句

以前算四天欠料,手扣十分钟还不敢保证对;现在一句自然语言,7种解法带速度榜,还自动建好目录、超链接、档案区。

这个「AI写表格公式」项目,每天一个PMC高频场景,连更7天,最后把所有打法封装成技能。今天的是第5个场景。

想要7种公式的完整清单,评论区扣「公式」。


术语解释

文章里的技术名词,一句话说清楚:

LET:给公式里反复使用的东西起个短名字,公式更短更好读。

动态数组:一个公式直接吐出一片结果,不用下拉填充。

MMULT(矩阵乘法):两张数字表格按行列规则相乘,一次算出一整片结果。

LAMBDA:写在公式里的自定义小函数,把一段计算逻辑打包反复调用。

REDUCE:带"累加器"的循环,每轮把上轮结果传进下轮,像滚雪球。

SCAN:跟REDUCE像兄弟,区别是每轮结果都留下,适合算"累计到某天"。

易失函数:OFFSET这类函数,表格任何改动都会触发它重算,数据一大就拖慢全表。

上三角矩阵:左下方全是0、右上方才有值的方阵,这里用来实现"累计到第几天"。


古老师(古哥计划)|中小制造数字化专家|金山 KVP(金山办公最有价值专家)|金山多维表格应用场景专家|金山 WPS 社区优秀创作者

深耕中小制造业数字化落地,擅长用 WPS 多维表格 + AI 低代码方案,帮工厂快速搭建进销存、生产计划、质量追溯等轻量化系统。不用复杂 IT,低成本落地,已服务数百家制造企业,实战经验丰富。

#AI写表格公式 #动态数组 #WPS表格 #PMC #欠料分析


本文由 AI 辅助创作

工具:灵犀专业版

模型:GLM-5.3-Flash 超高

江苏省
浏览 269
收藏
6
分享
6 +1
11
+1
全部评论 11
 
亂雲飛渡
点赞学习
   广东省
举报
0
1
古哥计划
古哥计划Lv.4 核心创作者KVP

Lv.4 核心创作者

感谢您的支持!您的支持是我更新的动力!
·
举报
0
0
 
小薛
打卡 过来学习 学习!
举报
0
1
古哥计划
古哥计划Lv.4 核心创作者KVP

Lv.4 核心创作者

感谢您的支持!每天训练灵犀已经成为习惯了
·
举报
0
0
 
CJ
打卡 过来学习 学习!
   浙江省
举报
0
1
古哥计划
古哥计划Lv.4 核心创作者KVP

Lv.4 核心创作者

感谢您的支持!相互学习,共同进步!
·
举报
0
0
 
临商珑胜
临商珑胜 Lv.2 潜力创作者WPS产品体验官

Lv.2 潜力创作者

感谢古老师的精彩分享,太强了
举报
0
2
古哥计划
古哥计划Lv.4 核心创作者KVP

Lv.4 核心创作者

感谢您的支持!,我自己的感受,近段时间,灵犀写公式的能力特别强,超出我的认知,经过训练后,人只需要说关键词,如欠料计算,累计求和,一对多等,命中率高达90%,并且全动态数组。
· 江苏省
举报
1
0
 
Abby(WPS版)
虽然用不上。。。但是!牛哇牛哇!!!
举报
0
1
古哥计划
古哥计划Lv.4 核心创作者KVP

Lv.4 核心创作者

感谢您的支持!
· 江苏省
举报
0
0