物料清单BOM展开——公式
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手动循环。。。
创作者俱乐部成员