物料清单BOM展开——公式

wils
wils

创作者俱乐部成员

还是这个问题:下面这个表里,每一行代表生产工件所需子件的数量,要展开这个表,列出生产工件A,所需的最末级子件及数量。

工件

子件

数量

A

B

1

A

C

2

B

C

3

B

D

4

D

C

5

D

E

6

曾经用SQL和JS解决过,一直想用公式尝试一下

https://bbs.wps.cn/topic/31900

现在还差一个groupby就可以实现,但我已经看不懂我写的是啥了。。。

📌

=LET(f,LAMBDA(x,y,IF(y>ROWS(x),x,f(IF(COUNTIF(A2:A7,INDEX(x,y,2))>0,VSTACK(x,LET(a,FILTER(A2:C7,A2:A7=INDEX(x,y,2)),b,REPTARRAY(INDEX(x,y,0),ROWS(a)),HSTACK(INDEX(b,0,1),INDEX(a,0,2),INDEX(b,0,3)*INDEX(a,0,3)))),x),y+1))),g,f(A2:C7,1),h,FILTER(g,COUNTIF(A2:A7,INDEX(g,0,2))=0),FILTER(h,INDEX(h,0,1)="A"))

思路还是一样的:把源表放到队列里,从队列里每次取出一行,与源表连接,数量相乘,结果再加入队列, 队列全部取出之后,再筛选出工件是A,子件不能再拆分的行,再groupby统计

个人感觉,SQL思路最清楚写起来最简单,JS在有了SQL之后思路也清晰,写起来稍微麻烦,公式写完就不知道自己写了啥了,太乱了。。。

公式的主要问题是,没有连接两个表的方法,map、reduce是逐单元格不是逐行,还得用lambda手动循环。。。

海南省
浏览 532
收藏
8
分享
8 +1
4
+1
全部评论 4
 
Boyuan
试着写了一个, 也是好长的火车 =LET(j,UNIQUE(FILTER(B2:B7,ISNA(XMATCH(B2:B7,A2:A7)))), HSTACK(CHOOSE({1,2},"A",j), MAP(j,LAMBDA(k,LET(dat, REDUCE({0,0},B2:B7,LAMBDA(x,y,IF(y=k,VSTACK(x,HSTACK(OFFSET(y,,1),XLOOKUP(OFFSET(y,,-1),B2:B7,C2:C7,1))),x))), SUMPRODUCT(TAKE(dat,,1),TAKE(dat,,-1)))))))
· 河南省
1
回复
wils
wils

创作者俱乐部成员

厉害
· 海南省
回复
 
亂雲飛渡
学习
· 广东省
回复
 
Boyuan
点赞, 学习中
· 河南省
回复