最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

excel - Allocations of units to shops based on rank but also allowing for widest possible distribution - Stack Overflow

programmeradmin3浏览0评论

Excel Screenshot

I'm looking to distribute product by rank (there will be no ties in the ranking) to 4 stores where I want to fill into as much of the need as possible in as many of the stores as possible.

I think I'm looking for a solution that is very similar to this one.

=IF(SUMPRODUCT(($B$2:$E$2<=B2)*$F$2:$I$2)<=$K$2,B2,MAX($K$2-SUMPRODUCT(($B$2:$E$2<=(B2-1))*$F$2:$I$2),0))

The problem with the above solution is that it allocates in a "winner take all" way. So if you have 3 units available to send it will tend to fill into the total demand of the highest ranking first and then distribute what's left over, filling into total demand of each subsequent store, until reaching zero available units.

I want a more even distribution of resources. For example, if I have three units available to send and I have nine stores with a demand of 18 units each, I'd want the top three stores to receive one unit each. Or, another way, if I have nine stores with a demand of two each (total 18 demand) and I have 17 units available, I'd want the top eight stores to receive 2 units and the bottom store to receive one unit.

Excel Screenshot

I'm looking to distribute product by rank (there will be no ties in the ranking) to 4 stores where I want to fill into as much of the need as possible in as many of the stores as possible.

I think I'm looking for a solution that is very similar to this one.

=IF(SUMPRODUCT(($B$2:$E$2<=B2)*$F$2:$I$2)<=$K$2,B2,MAX($K$2-SUMPRODUCT(($B$2:$E$2<=(B2-1))*$F$2:$I$2),0))

The problem with the above solution is that it allocates in a "winner take all" way. So if you have 3 units available to send it will tend to fill into the total demand of the highest ranking first and then distribute what's left over, filling into total demand of each subsequent store, until reaching zero available units.

I want a more even distribution of resources. For example, if I have three units available to send and I have nine stores with a demand of 18 units each, I'd want the top three stores to receive one unit each. Or, another way, if I have nine stores with a demand of two each (total 18 demand) and I have 17 units available, I'd want the top eight stores to receive 2 units and the bottom store to receive one unit.

Share Improve this question asked Mar 14 at 19:33 DMad0423DMad0423 131 silver badge2 bronze badges
Add a comment  | 

3 Answers 3

Reset to default 1

Using the data as in Evil Blue Monkey's answer you could use the following formula in L2:

=IF(K2,SORTBY(REDUCE({0,0,0,0},SEQUENCE(K2),LAMBDA(x,y,x+DROP(REDUCE(0,(x<SORTBY(F2:I2,B2:E2))*(SUM(x)<K2),LAMBDA(a,b,HSTACK(a,(SUM(x,a,b)<=K2)*b))),,1))),XMATCH({1,2,3,4},B2:E2)),{0,0,0,0})

This spills the result for that row over 4 cells to the right.

It starts counting at 0 for each store and adds 1 per store each iteration, where works in order of ranking it checks if the total sum does not exceed the availability and the total sum per store doesn't exceed the demand.

I don't know if there might be a more compact solution, but this one should work (paste it in a new sheet):

SKU Store 1 Rank Store 2 Rank Store 3 Rank Store 4 Rank Store 1 Demand Store 2 Demand Store 3 Demand Store 4 Demand Total Demand Avaiable Stage 1 Store 1 Min Quot Store 2 Min Quot Store 3 Min Quot Store 4 Min Quot Min Quot Order Order total Remains Stage 2 Store 1 Demand Store 2 Demand Store 3 Demand Store 4 Demand Store 1 Min Quot Store 2 Min Quot Store 3 Min Quot Store 4 Min Quot Min Quot Order Order total Remains Stage 3 Store 1 Demand Store 2 Demand Store 3 Demand Store 4 Demand Store 1 Min Quot Store 2 Min Quot Store 3 Min Quot Store 4 Min Quot Min Quot Order Order total Remains Stage 4 Store 1 Rank Store 2 Rank Store 3 Rank Store 4 Rank Store 1 Order Store 2 Order Store 3 Order Store 4 Order Order Store 1 Total Order Store 2 Total Order Store 3 Total Order Store 4 Total Order Order Total
Socks #1 1 4 3 2 5 7 8 2 =SUM(F2:I2) 10 =MIN(F2,QUOTIENT($K2,COUNTIF($F2:$I2,">"&0))) =MIN(G2,QUOTIENT($K2,COUNTIF($F2:$I2,">"&0))) =MIN(H2,QUOTIENT($K2,COUNTIF($F2:$I2,">"&0))) =MIN(I2,QUOTIENT($K2,COUNTIF($F2:$I2,">"&0))) =IFERROR(AGGREGATE(15,6,M2:P2/(M2:P2<>0),1),0) =IFERROR(REPT(IF(M2,$B2&";","")&IF(N2,$C2&";","")&IF(O2,$D2&";","")&IF(P2,$E2&";",""),Q2),"") =LEN(R2)-LEN(SUBSTITUTE(R2,";","")) =K2-S2 =F2-(LEN($R2)-LEN(SUBSTITUTE($R2,B2&";","")))/2 =G2-(LEN($R2)-LEN(SUBSTITUTE($R2,C2&";","")))/2 =H2-(LEN($R2)-LEN(SUBSTITUTE($R2,D2&";","")))/2 =I2-(LEN($R2)-LEN(SUBSTITUTE($R2,E2&";","")))/2 =MIN(V2,QUOTIENT($T2,COUNTIF($V2:$Y2,">"&0))) =MIN(W2,QUOTIENT($T2,COUNTIF($V2:$Y2,">"&0))) =MIN(X2,QUOTIENT($T2,COUNTIF($V2:$Y2,">"&0))) =MIN(Y2,QUOTIENT($T2,COUNTIF($V2:$Y2,">"&0))) =IFERROR(AGGREGATE(15,6,Z2:AC2/(Z2:AC2<>0),1),0) =IFERROR(REPT(IF(Z2,$B2&";","")&IF(AA2,$C2&";","")&IF(AB2,$D2&";","")&IF(AC2,$E2&";",""),AD2),"") =LEN(AE2)-LEN(SUBSTITUTE(AE2,";","")) =T2-AF2 =V2-(LEN($AE2)-LEN(SUBSTITUTE($AE2,B2&";","")))/2 =W2-(LEN($AE2)-LEN(SUBSTITUTE($AE2,C2&";","")))/2 =X2-(LEN($AE2)-LEN(SUBSTITUTE($AE2,D2&";","")))/2 =Y2-(LEN($AE2)-LEN(SUBSTITUTE($AE2,E2&";","")))/2 =MIN(AI2,QUOTIENT($AG2,COUNTIF($AI2:$AL2,">"&0))) =MIN(AJ2,QUOTIENT($AG2,COUNTIF($AI2:$AL2,">"&0))) =MIN(AK2,QUOTIENT($AG2,COUNTIF($AI2:$AL2,">"&0))) =MIN(AL2,QUOTIENT($AG2,COUNTIF($AI2:$AL2,">"&0))) =IFERROR(AGGREGATE(15,6,AM2:AP2/(AM2:AP2<>0),1),0) =IFERROR(REPT(IF(AM2,$B2&";","")&IF(AN2,$C2&";","")&IF(AO2,$D2&";","")&IF(AP2,$E2&";",""),AQ2),"") =LEN(AR2)-LEN(SUBSTITUTE(AR2,";","")) =AG2-AS2 =IF(AI2,B2,"") =IF(AJ2,C2,"") =IF(AK2,D2,"") =IF(AL2,E2,"") =IFERROR(IF(COLUMNS($AZ2:AZ2)>$AT2,"",AGGREGATE(15,6,$AV2:$AY2,COLUMNS($AZ2:AZ2))&";"),"") =IFERROR(IF(COLUMNS($AZ2:BA2)>$AT2,"",AGGREGATE(15,6,$AV2:$AY2,COLUMNS($AZ2:BA2))&";"),"") =IFERROR(IF(COLUMNS($AZ2:BB2)>$AT2,"",AGGREGATE(15,6,$AV2:$AY2,COLUMNS($AZ2:BB2))&";"),"") =IFERROR(IF(COLUMNS($AZ2:BC2)>$AT2,"",AGGREGATE(15,6,$AV2:$AY2,COLUMNS($AZ2:BC2))&";"),"") =R2&AE2&AR2&AZ2&BA2&BB2&BC2 =(LEN($BD2)-LEN(SUBSTITUTE($BD2,B2&";","")))/2 =(LEN($BD2)-LEN(SUBSTITUTE($BD2,C2&";","")))/2 =(LEN($BD2)-LEN(SUBSTITUTE($BD2,D2&";","")))/2 =(LEN($BD2)-LEN(SUBSTITUTE($BD2,E2&";","")))/2 =SUM(BE2:BH2)
Socks #2 4 3 2 1 3 2 4 1 =SUM(F3:I3) 1 =MIN(F3,QUOTIENT($K3,COUNTIF($F3:$I3,">"&0))) =MIN(G3,QUOTIENT($K3,COUNTIF($F3:$I3,">"&0))) =MIN(H3,QUOTIENT($K3,COUNTIF($F3:$I3,">"&0))) =MIN(I3,QUOTIENT($K3,COUNTIF($F3:$I3,">"&0))) =IFERROR(AGGREGATE(15,6,M3:P3/(M3:P3<>0),1),0) =IFERROR(REPT(IF(M3,$B3&";","")&IF(N3,$C3&";","")&IF(O3,$D3&";","")&IF(P3,$E3&";",""),Q3),"") =LEN(R3)-LEN(SUBSTITUTE(R3,";","")) =K3-S3 =F3-(LEN($R3)-LEN(SUBSTITUTE($R3,B3&";","")))/2 =G3-(LEN($R3)-LEN(SUBSTITUTE($R3,C3&";","")))/2 =H3-(LEN($R3)-LEN(SUBSTITUTE($R3,D3&";","")))/2 =I3-(LEN($R3)-LEN(SUBSTITUTE($R3,E3&";","")))/2 =MIN(V3,QUOTIENT($T3,COUNTIF($V3:$Y3,">"&0))) =MIN(W3,QUOTIENT($T3,COUNTIF($V3:$Y3,">"&0))) =MIN(X3,QUOTIENT($T3,COUNTIF($V3:$Y3,">"&0))) =MIN(Y3,QUOTIENT($T3,COUNTIF($V3:$Y3,">"&0))) =IFERROR(AGGREGATE(15,6,Z3:AC3/(Z3:AC3<>0),1),0) =IFERROR(REPT(IF(Z3,$B3&";","")&IF(AA3,$C3&";","")&IF(AB3,$D3&";","")&IF(AC3,$E3&";",""),AD3),"") =LEN(AE3)-LEN(SUBSTITUTE(AE3,";","")) =T3-AF3 =V3-(LEN($AE3)-LEN(SUBSTITUTE($AE3,B3&";","")))/2 =W3-(LEN($AE3)-LEN(SUBSTITUTE($AE3,C3&";","")))/2 =X3-(LEN($AE3)-LEN(SUBSTITUTE($AE3,D3&";","")))/2 =Y3-(LEN($AE3)-LEN(SUBSTITUTE($AE3,E3&";","")))/2 =MIN(AI3,QUOTIENT($AG3,COUNTIF($AI3:$AL3,">"&0))) =MIN(AJ3,QUOTIENT($AG3,COUNTIF($AI3:$AL3,">"&0))) =MIN(AK3,QUOTIENT($AG3,COUNTIF($AI3:$AL3,">"&0))) =MIN(AL3,QUOTIENT($AG3,COUNTIF($AI3:$AL3,">"&0))) =IFERROR(AGGREGATE(15,6,AM3:AP3/(AM3:AP3<>0),1),0) =IFERROR(REPT(IF(AM3,$B3&";","")&IF(AN3,$C3&";","")&IF(AO3,$D3&";","")&IF(AP3,$E3&";",""),AQ3),"") =LEN(AR3)-LEN(SUBSTITUTE(AR3,";","")) =AG3-AS3 =IF(AI3,B3,"") =IF(AJ3,C3,"") =IF(AK3,D3,"") =IF(AL3,E3,"") =IFERROR(IF(COLUMNS($AZ3:AZ3)>$AT3,"",AGGREGATE(15,6,$AV3:$AY3,COLUMNS($AZ3:AZ3))&";"),"") =IFERROR(IF(COLUMNS($AZ3:BA3)>$AT3,"",AGGREGATE(15,6,$AV3:$AY3,COLUMNS($AZ3:BA3))&";"),"") =IFERROR(IF(COLUMNS($AZ3:BB3)>$AT3,"",AGGREGATE(15,6,$AV3:$AY3,COLUMNS($AZ3:BB3))&";"),"") =IFERROR(IF(COLUMNS($AZ3:BC3)>$AT3,"",AGGREGATE(15,6,$AV3:$AY3,COLUMNS($AZ3:BC3))&";"),"") =R3&AE3&AR3&AZ3&BA3&BB3&BC3 =(LEN($BD3)-LEN(SUBSTITUTE($BD3,B3&";","")))/2 =(LEN($BD3)-LEN(SUBSTITUTE($BD3,C3&";","")))/2 =(LEN($BD3)-LEN(SUBSTITUTE($BD3,D3&";","")))/2 =(LEN($BD3)-LEN(SUBSTITUTE($BD3,E3&";","")))/2 =SUM(BE3:BH3)
Socks #3 4 3 2 1 3 7 5 4 =SUM(F4:I4) 3 =MIN(F4,QUOTIENT($K4,COUNTIF($F4:$I4,">"&0))) =MIN(G4,QUOTIENT($K4,COUNTIF($F4:$I4,">"&0))) =MIN(H4,QUOTIENT($K4,COUNTIF($F4:$I4,">"&0))) =MIN(I4,QUOTIENT($K4,COUNTIF($F4:$I4,">"&0))) =IFERROR(AGGREGATE(15,6,M4:P4/(M4:P4<>0),1),0) =IFERROR(REPT(IF(M4,$B4&";","")&IF(N4,$C4&";","")&IF(O4,$D4&";","")&IF(P4,$E4&";",""),Q4),"") =LEN(R4)-LEN(SUBSTITUTE(R4,";","")) =K4-S4 =F4-(LEN($R4)-LEN(SUBSTITUTE($R4,B4&";","")))/2 =G4-(LEN($R4)-LEN(SUBSTITUTE($R4,C4&";","")))/2 =H4-(LEN($R4)-LEN(SUBSTITUTE($R4,D4&";","")))/2 =I4-(LEN($R4)-LEN(SUBSTITUTE($R4,E4&";","")))/2 =MIN(V4,QUOTIENT($T4,COUNTIF($V4:$Y4,">"&0))) =MIN(W4,QUOTIENT($T4,COUNTIF($V4:$Y4,">"&0))) =MIN(X4,QUOTIENT($T4,COUNTIF($V4:$Y4,">"&0))) =MIN(Y4,QUOTIENT($T4,COUNTIF($V4:$Y4,">"&0))) =IFERROR(AGGREGATE(15,6,Z4:AC4/(Z4:AC4<>0),1),0) =IFERROR(REPT(IF(Z4,$B4&";","")&IF(AA4,$C4&";","")&IF(AB4,$D4&";","")&IF(AC4,$E4&";",""),AD4),"") =LEN(AE4)-LEN(SUBSTITUTE(AE4,";","")) =T4-AF4 =V4-(LEN($AE4)-LEN(SUBSTITUTE($AE4,B4&";","")))/2 =W4-(LEN($AE4)-LEN(SUBSTITUTE($AE4,C4&";","")))/2 =X4-(LEN($AE4)-LEN(SUBSTITUTE($AE4,D4&";","")))/2 =Y4-(LEN($AE4)-LEN(SUBSTITUTE($AE4,E4&";","")))/2 =MIN(AI4,QUOTIENT($AG4,COUNTIF($AI4:$AL4,">"&0))) =MIN(AJ4,QUOTIENT($AG4,COUNTIF($AI4:$AL4,">"&0))) =MIN(AK4,QUOTIENT($AG4,COUNTIF($AI4:$AL4,">"&0))) =MIN(AL4,QUOTIENT($AG4,COUNTIF($AI4:$AL4,">"&0))) =IFERROR(AGGREGATE(15,6,AM4:AP4/(AM4:AP4<>0),1),0) =IFERROR(REPT(IF(AM4,$B4&";","")&IF(AN4,$C4&";","")&IF(AO4,$D4&";","")&IF(AP4,$E4&";",""),AQ4),"") =LEN(AR4)-LEN(SUBSTITUTE(AR4,";","")) =AG4-AS4 =IF(AI4,B4,"") =IF(AJ4,C4,"") =IF(AK4,D4,"") =IF(AL4,E4,"") =IFERROR(IF(COLUMNS($AZ4:AZ4)>$AT4,"",AGGREGATE(15,6,$AV4:$AY4,COLUMNS($AZ4:AZ4))&";"),"") =IFERROR(IF(COLUMNS($AZ4:BA4)>$AT4,"",AGGREGATE(15,6,$AV4:$AY4,COLUMNS($AZ4:BA4))&";"),"") =IFERROR(IF(COLUMNS($AZ4:BB4)>$AT4,"",AGGREGATE(15,6,$AV4:$AY4,COLUMNS($AZ4:BB4))&";"),"") =IFERROR(IF(COLUMNS($AZ4:BC4)>$AT4,"",AGGREGATE(15,6,$AV4:$AY4,COLUMNS($AZ4:BC4))&";"),"") =R4&AE4&AR4&AZ4&BA4&BB4&BC4 =(LEN($BD4)-LEN(SUBSTITUTE($BD4,B4&";","")))/2 =(LEN($BD4)-LEN(SUBSTITUTE($BD4,C4&";","")))/2 =(LEN($BD4)-LEN(SUBSTITUTE($BD4,D4&";","")))/2 =(LEN($BD4)-LEN(SUBSTITUTE($BD4,E4&";","")))/2 =SUM(BE4:BH4)
Socks #4 1 2 3 4 5 5 5 8 =SUM(F5:I5) 30 =MIN(F5,QUOTIENT($K5,COUNTIF($F5:$I5,">"&0))) =MIN(G5,QUOTIENT($K5,COUNTIF($F5:$I5,">"&0))) =MIN(H5,QUOTIENT($K5,COUNTIF($F5:$I5,">"&0))) =MIN(I5,QUOTIENT($K5,COUNTIF($F5:$I5,">"&0))) =IFERROR(AGGREGATE(15,6,M5:P5/(M5:P5<>0),1),0) =IFERROR(REPT(IF(M5,$B5&";","")&IF(N5,$C5&";","")&IF(O5,$D5&";","")&IF(P5,$E5&";",""),Q5),"") =LEN(R5)-LEN(SUBSTITUTE(R5,";","")) =K5-S5 =F5-(LEN($R5)-LEN(SUBSTITUTE($R5,B5&";","")))/2 =G5-(LEN($R5)-LEN(SUBSTITUTE($R5,C5&";","")))/2 =H5-(LEN($R5)-LEN(SUBSTITUTE($R5,D5&";","")))/2 =I5-(LEN($R5)-LEN(SUBSTITUTE($R5,E5&";","")))/2 =MIN(V5,QUOTIENT($T5,COUNTIF($V5:$Y5,">"&0))) =MIN(W5,QUOTIENT($T5,COUNTIF($V5:$Y5,">"&0))) =MIN(X5,QUOTIENT($T5,COUNTIF($V5:$Y5,">"&0))) =MIN(Y5,QUOTIENT($T5,COUNTIF($V5:$Y5,">"&0))) =IFERROR(AGGREGATE(15,6,Z5:AC5/(Z5:AC5<>0),1),0) =IFERROR(REPT(IF(Z5,$B5&";","")&IF(AA5,$C5&";","")&IF(AB5,$D5&";","")&IF(AC5,$E5&";",""),AD5),"") =LEN(AE5)-LEN(SUBSTITUTE(AE5,";","")) =T5-AF5 =V5-(LEN($AE5)-LEN(SUBSTITUTE($AE5,B5&";","")))/2 =W5-(LEN($AE5)-LEN(SUBSTITUTE($AE5,C5&";","")))/2 =X5-(LEN($AE5)-LEN(SUBSTITUTE($AE5,D5&";","")))/2 =Y5-(LEN($AE5)-LEN(SUBSTITUTE($AE5,E5&";","")))/2 =MIN(AI5,QUOTIENT($AG5,COUNTIF($AI5:$AL5,">"&0))) =MIN(AJ5,QUOTIENT($AG5,COUNTIF($AI5:$AL5,">"&0))) =MIN(AK5,QUOTIENT($AG5,COUNTIF($AI5:$AL5,">"&0))) =MIN(AL5,QUOTIENT($AG5,COUNTIF($AI5:$AL5,">"&0))) =IFERROR(AGGREGATE(15,6,AM5:AP5/(AM5:AP5<>0),1),0) =IFERROR(REPT(IF(AM5,$B5&";","")&IF(AN5,$C5&";","")&IF(AO5,$D5&";","")&IF(AP5,$E5&";",""),AQ5),"") =LEN(AR5)-LEN(SUBSTITUTE(AR5,";","")) =AG5-AS5 =IF(AI5,B5,"") =IF(AJ5,C5,"") =IF(AK5,D5,"") =IF(AL5,E5,"") =IFERROR(IF(COLUMNS($AZ5:AZ5)>$AT5,"",AGGREGATE(15,6,$AV5:$AY5,COLUMNS($AZ5:AZ5))&";"),"") =IFERROR(IF(COLUMNS($AZ5:BA5)>$AT5,"",AGGREGATE(15,6,$AV5:$AY5,COLUMNS($AZ5:BA5))&";"),"") =IFERROR(IF(COLUMNS($AZ5:BB5)>$AT5,"",AGGREGATE(15,6,$AV5:$AY5,COLUMNS($AZ5:BB5))&";"),"") =IFERROR(IF(COLUMNS($AZ5:BC5)>$AT5,"",AGGREGATE(15,6,$AV5:$AY5,COLUMNS($AZ5:BC5))&";"),"") =R5&AE5&AR5&AZ5&BA5&BB5&BC5 =(LEN($BD5)-LEN(SUBSTITUTE($BD5,B5&";","")))/2 =(LEN($BD5)-LEN(SUBSTITUTE($BD5,C5&";","")))/2 =(LEN($BD5)-LEN(SUBSTITUTE($BD5,D5&";","")))/2 =(LEN($BD5)-LEN(SUBSTITUTE($BD5,E5&";","")))/2 =SUM(BE5:BH5)
Socks #5 4 3 2 1 6 1 2 7 =SUM(F6:I6) 15 =MIN(F6,QUOTIENT($K6,COUNTIF($F6:$I6,">"&0))) =MIN(G6,QUOTIENT($K6,COUNTIF($F6:$I6,">"&0))) =MIN(H6,QUOTIENT($K6,COUNTIF($F6:$I6,">"&0))) =MIN(I6,QUOTIENT($K6,COUNTIF($F6:$I6,">"&0))) =IFERROR(AGGREGATE(15,6,M6:P6/(M6:P6<>0),1),0) =IFERROR(REPT(IF(M6,$B6&";","")&IF(N6,$C6&";","")&IF(O6,$D6&";","")&IF(P6,$E6&";",""),Q6),"") =LEN(R6)-LEN(SUBSTITUTE(R6,";","")) =K6-S6 =F6-(LEN($R6)-LEN(SUBSTITUTE($R6,B6&";","")))/2 =G6-(LEN($R6)-LEN(SUBSTITUTE($R6,C6&";","")))/2 =H6-(LEN($R6)-LEN(SUBSTITUTE($R6,D6&";","")))/2 =I6-(LEN($R6)-LEN(SUBSTITUTE($R6,E6&";","")))/2 =MIN(V6,QUOTIENT($T6,COUNTIF($V6:$Y6,">"&0))) =MIN(W6,QUOTIENT($T6,COUNTIF($V6:$Y6,">"&0))) =MIN(X6,QUOTIENT($T6,COUNTIF($V6:$Y6,">"&0))) =MIN(Y6,QUOTIENT($T6,COUNTIF($V6:$Y6,">"&0))) =IFERROR(AGGREGATE(15,6,Z6:AC6/(Z6:AC6<>0),1),0) =IFERROR(REPT(IF(Z6,$B6&";","")&IF(AA6,$C6&";","")&IF(AB6,$D6&";","")&IF(AC6,$E6&";",""),AD6),"") =LEN(AE6)-LEN(SUBSTITUTE(AE6,";","")) =T6-AF6 =V6-(LEN($AE6)-LEN(SUBSTITUTE($AE6,B6&";","")))/2 =W6-(LEN($AE6)-LEN(SUBSTITUTE($AE6,C6&";","")))/2 =X6-(LEN($AE6)-LEN(SUBSTITUTE($AE6,D6&";","")))/2 =Y6-(LEN($AE6)-LEN(SUBSTITUTE($AE6,E6&";","")))/2 =MIN(AI6,QUOTIENT($AG6,COUNTIF($AI6:$AL6,">"&0))) =MIN(AJ6,QUOTIENT($AG6,COUNTIF($AI6:$AL6,">"&0))) =MIN(AK6,QUOTIENT($AG6,COUNTIF($AI6:$AL6,">"&0))) =MIN(AL6,QUOTIENT($AG6,COUNTIF($AI6:$AL6,">"&0))) =IFERROR(AGGREGATE(15,6,AM6:AP6/(AM6:AP6<>0),1),0) =IFERROR(REPT(IF(AM6,$B6&";","")&IF(AN6,$C6&";","")&IF(AO6,$D6&";","")&IF(AP6,$E6&";",""),AQ6),"") =LEN(AR6)-LEN(SUBSTITUTE(AR6,";","")) =AG6-AS6 =IF(AI6,B6,"") =IF(AJ6,C6,"") =IF(AK6,D6,"") =IF(AL6,E6,"") =IFERROR(IF(COLUMNS($AZ6:AZ6)>$AT6,"",AGGREGATE(15,6,$AV6:$AY6,COLUMNS($AZ6:AZ6))&";"),"") =IFERROR(IF(COLUMNS($AZ6:BA6)>$AT6,"",AGGREGATE(15,6,$AV6:$AY6,COLUMNS($AZ6:BA6))&";"),"") =IFERROR(IF(COLUMNS($AZ6:BB6)>$AT6,"",AGGREGATE(15,6,$AV6:$AY6,COLUMNS($AZ6:BB6))&";"),"") =IFERROR(IF(COLUMNS($AZ6:BC6)>$AT6,"",AGGREGATE(15,6,$AV6:$AY6,COLUMNS($AZ6:BC6))&";"),"") =R6&AE6&AR6&AZ6&BA6&BB6&BC6 =(LEN($BD6)-LEN(SUBSTITUTE($BD6,B6&";","")))/2 =(LEN($BD6)-LEN(SUBSTITUTE($BD6,C6&";","")))/2 =(LEN($BD6)-LEN(SUBSTITUTE($BD6,D6&";","")))/2 =(LEN($BD6)-LEN(SUBSTITUTE($BD6,E6&";","")))/2 =SUM(BE6:BH6)
Socks #6 1 2 3 4 0 2 0 5 =SUM(F7:I7) 4 =MIN(F7,QUOTIENT($K7,COUNTIF($F7:$I7,">"&0))) =MIN(G7,QUOTIENT($K7,COUNTIF($F7:$I7,">"&0))) =MIN(H7,QUOTIENT($K7,COUNTIF($F7:$I7,">"&0))) =MIN(I7,QUOTIENT($K7,COUNTIF($F7:$I7,">"&0))) =IFERROR(AGGREGATE(15,6,M7:P7/(M7:P7<>0),1),0) =IFERROR(REPT(IF(M7,$B7&";","")&IF(N7,$C7&";","")&IF(O7,$D7&";","")&IF(P7,$E7&";",""),Q7),"") =LEN(R7)-LEN(SUBSTITUTE(R7,";","")) =K7-S7 =F7-(LEN($R7)-LEN(SUBSTITUTE($R7,B7&";","")))/2 =G7-(LEN($R7)-LEN(SUBSTITUTE($R7,C7&";","")))/2 =H7-(LEN($R7)-LEN(SUBSTITUTE($R7,D7&";","")))/2 =I7-(LEN($R7)-LEN(SUBSTITUTE($R7,E7&";","")))/2 =MIN(V7,QUOTIENT($T7,COUNTIF($V7:$Y7,">"&0))) =MIN(W7,QUOTIENT($T7,COUNTIF($V7:$Y7,">"&0))) =MIN(X7,QUOTIENT($T7,COUNTIF($V7:$Y7,">"&0))) =MIN(Y7,QUOTIENT($T7,COUNTIF($V7:$Y7,">"&0))) =IFERROR(AGGREGATE(15,6,Z7:AC7/(Z7:AC7<>0),1),0) =IFERROR(REPT(IF(Z7,$B7&";","")&IF(AA7,$C7&";","")&IF(AB7,$D7&";","")&IF(AC7,$E7&";",""),AD7),"") =LEN(AE7)-LEN(SUBSTITUTE(AE7,";","")) =T7-AF7 =V7-(LEN($AE7)-LEN(SUBSTITUTE($AE7,B7&";","")))/2 =W7-(LEN($AE7)-LEN(SUBSTITUTE($AE7,C7&";","")))/2 =X7-(LEN($AE7)-LEN(SUBSTITUTE($AE7,D7&";","")))/2 =Y7-(LEN($AE7)-LEN(SUBSTITUTE($AE7,E7&";","")))/2 =MIN(AI7,QUOTIENT($AG7,COUNTIF($AI7:$AL7,">"&0))) =MIN(AJ7,QUOTIENT($AG7,COUNTIF($AI7:$AL7,">"&0))) =MIN(AK7,QUOTIENT($AG7,COUNTIF($AI7:$AL7,">"&0))) =MIN(AL7,QUOTIENT($AG7,COUNTIF($AI7:$AL7,">"&0))) =IFERROR(AGGREGATE(15,6,AM7:AP7/(AM7:AP7<>0),1),0) =IFERROR(REPT(IF(AM7,$B7&";","")&IF(AN7,$C7&";","")&IF(AO7,$D7&";","")&IF(AP7,$E7&";",""),AQ7),"") =LEN(AR7)-LEN(SUBSTITUTE(AR7,";","")) =AG7-AS7 =IF(AI7,B7,"") =IF(AJ7,C7,"") =IF(AK7,D7,"") =IF(AL7,E7,"") =IFERROR(IF(COLUMNS($AZ7:AZ7)>$AT7,"",AGGREGATE(15,6,$AV7:$AY7,COLUMNS($AZ7:AZ7))&";"),"") =IFERROR(IF(COLUMNS($AZ7:BA7)>$AT7,"",AGGREGATE(15,6,$AV7:$AY7,COLUMNS($AZ7:BA7))&";"),"") =IFERROR(IF(COLUMNS($AZ7:BB7)>$AT7,"",AGGREGATE(15,6,$AV7:$AY7,COLUMNS($AZ7:BB7))&";"),"") =IFERROR(IF(COLUMNS($AZ7:BC7)>$AT7,"",AGGREGATE(15,6,$AV7:$AY7,COLUMNS($AZ7:BC7))&";"),"") =R7&AE7&AR7&AZ7&BA7&BB7&BC7 =(LEN($BD7)-LEN(SUBSTITUTE($BD7,B7&";","")))/2 =(LEN($BD7)-LEN(SUBSTITUTE($BD7,C7&";","")))/2 =(LEN($BD7)-LEN(SUBSTITUTE($BD7,D7&";","")))/2 =(LEN($BD7)-LEN(SUBSTITUTE($BD7,E7&";","")))/2 =SUM(BE7:BH7)
Socks #7 2 4 3 1 0 0 0 8 =SUM(F8:I8) 0 =MIN(F8,QUOTIENT($K8,COUNTIF($F8:$I8,">"&0))) =MIN(G8,QUOTIENT($K8,COUNTIF($F8:$I8,">"&0))) =MIN(H8,QUOTIENT($K8,COUNTIF($F8:$I8,">"&0))) =MIN(I8,QUOTIENT($K8,COUNTIF($F8:$I8,">"&0))) =IFERROR(AGGREGATE(15,6,M8:P8/(M8:P8<>0),1),0) =IFERROR(REPT(IF(M8,$B8&";","")&IF(N8,$C8&";","")&IF(O8,$D8&";","")&IF(P8,$E8&";",""),Q8),"") =LEN(R8)-LEN(SUBSTITUTE(R8,";","")) =K8-S8 =F8-(LEN($R8)-LEN(SUBSTITUTE($R8,B8&";","")))/2 =G8-(LEN($R8)-LEN(SUBSTITUTE($R8,C8&";","")))/2 =H8-(LEN($R8)-LEN(SUBSTITUTE($R8,D8&";","")))/2 =I8-(LEN($R8)-LEN(SUBSTITUTE($R8,E8&";","")))/2 =MIN(V8,QUOTIENT($T8,COUNTIF($V8:$Y8,">"&0))) =MIN(W8,QUOTIENT($T8,COUNTIF($V8:$Y8,">"&0))) =MIN(X8,QUOTIENT($T8,COUNTIF($V8:$Y8,">"&0))) =MIN(Y8,QUOTIENT($T8,COUNTIF($V8:$Y8,">"&0))) =IFERROR(AGGREGATE(15,6,Z8:AC8/(Z8:AC8<>0),1),0) =IFERROR(REPT(IF(Z8,$B8&";","")&IF(AA8,$C8&";","")&IF(AB8,$D8&";","")&IF(AC8,$E8&";",""),AD8),"") =LEN(AE8)-LEN(SUBSTITUTE(AE8,";","")) =T8-AF8 =V8-(LEN($AE8)-LEN(SUBSTITUTE($AE8,B8&";","")))/2 =W8-(LEN($AE8)-LEN(SUBSTITUTE($AE8,C8&";","")))/2 =X8-(LEN($AE8)-LEN(SUBSTITUTE($AE8,D8&";","")))/2 =Y8-(LEN($AE8)-LEN(SUBSTITUTE($AE8,E8&";","")))/2 =MIN(AI8,QUOTIENT($AG8,COUNTIF($AI8:$AL8,">"&0))) =MIN(AJ8,QUOTIENT($AG8,COUNTIF($AI8:$AL8,">"&0))) =MIN(AK8,QUOTIENT($AG8,COUNTIF($AI8:$AL8,">"&0))) =MIN(AL8,QUOTIENT($AG8,COUNTIF($AI8:$AL8,">"&0))) =IFERROR(AGGREGATE(15,6,AM8:AP8/(AM8:AP8<>0),1),0) =IFERROR(REPT(IF(AM8,$B8&";","")&IF(AN8,$C8&";","")&IF(AO8,$D8&";","")&IF(AP8,$E8&";",""),AQ8),"") =LEN(AR8)-LEN(SUBSTITUTE(AR8,";","")) =AG8-AS8 =IF(AI8,B8,"") =IF(AJ8,C8,"") =IF(AK8,D8,"") =IF(AL8,E8,"") =IFERROR(IF(COLUMNS($AZ8:AZ8)>$AT8,"",AGGREGATE(15,6,$AV8:$AY8,COLUMNS($AZ8:AZ8))&";"),"") =IFERROR(IF(COLUMNS($AZ8:BA8)>$AT8,"",AGGREGATE(15,6,$AV8:$AY8,COLUMNS($AZ8:BA8))&";"),"") =IFERROR(IF(COLUMNS($AZ8:BB8)>$AT8,"",AGGREGATE(15,6,$AV8:$AY8,COLUMNS($AZ8:BB8))&";"),"") =IFERROR(IF(COLUMNS($AZ8:BC8)>$AT8,"",AGGREGATE(15,6,$AV8:$AY8,COLUMNS($AZ8:BC8))&";"),"") =R8&AE8&AR8&AZ8&BA8&BB8&BC8 =(LEN($BD8)-LEN(SUBSTITUTE($BD8,B8&";","")))/2 =(LEN($BD8)-LEN(SUBSTITUTE($BD8,C8&";","")))/2 =(LEN($BD8)-LEN(SUBSTITUTE($BD8,D8&";","")))/2 =(LEN($BD8)-LEN(SUBSTITUTE($BD8,E8&";","")))/2 =SUM(BE8:BH8)
Socks #8 1 2 3 4 1 2 3 4 =SUM(F9:I9) 9 =MIN(F9,QUOTIENT($K9,COUNTIF($F9:$I9,">"&0))) =MIN(G9,QUOTIENT($K9,COUNTIF($F9:$I9,">"&0))) =MIN(H9,QUOTIENT($K9,COUNTIF($F9:$I9,">"&0))) =MIN(I9,QUOTIENT($K9,COUNTIF($F9:$I9,">"&0))) =IFERROR(AGGREGATE(15,6,M9:P9/(M9:P9<>0),1),0) =IFERROR(REPT(IF(M9,$B9&";","")&IF(N9,$C9&";","")&IF(O9,$D9&";","")&IF(P9,$E9&";",""),Q9),"") =LEN(R9)-LEN(SUBSTITUTE(R9,";","")) =K9-S9 =F9-(LEN($R9)-LEN(SUBSTITUTE($R9,B9&";","")))/2 =G9-(LEN($R9)-LEN(SUBSTITUTE($R9,C9&";","")))/2 =H9-(LEN($R9)-LEN(SUBSTITUTE($R9,D9&";","")))/2 =I9-(LEN($R9)-LEN(SUBSTITUTE($R9,E9&";","")))/2 =MIN(V9,QUOTIENT($T9,COUNTIF($V9:$Y9,">"&0))) =MIN(W9,QUOTIENT($T9,COUNTIF($V9:$Y9,">"&0))) =MIN(X9,QUOTIENT($T9,COUNTIF($V9:$Y9,">"&0))) =MIN(Y9,QUOTIENT($T9,COUNTIF($V9:$Y9,">"&0))) =IFERROR(AGGREGATE(15,6,Z9:AC9/(Z9:AC9<>0),1),0) =IFERROR(REPT(IF(Z9,$B9&";","")&IF(AA9,$C9&";","")&IF(AB9,$D9&";","")&IF(AC9,$E9&";",""),AD9),"") =LEN(AE9)-LEN(SUBSTITUTE(AE9,";","")) =T9-AF9 =V9-(LEN($AE9)-LEN(SUBSTITUTE($AE9,B9&";","")))/2 =W9-(LEN($AE9)-LEN(SUBSTITUTE($AE9,C9&";","")))/2 =X9-(LEN($AE9)-LEN(SUBSTITUTE($AE9,D9&";","")))/2 =Y9-(LEN($AE9)-LEN(SUBSTITUTE($AE9,E9&";","")))/2 =MIN(AI9,QUOTIENT($AG9,COUNTIF($AI9:$AL9,">"&0))) =MIN(AJ9,QUOTIENT($AG9,COUNTIF($AI9:$AL9,">"&0))) =MIN(AK9,QUOTIENT($AG9,COUNTIF($AI9:$AL9,">"&0))) =MIN(AL9,QUOTIENT($AG9,COUNTIF($AI9:$AL9,">"&0))) =IFERROR(AGGREGATE(15,6,AM9:AP9/(AM9:AP9<>0),1),0) =IFERROR(REPT(IF(AM9,$B9&";","")&IF(AN9,$C9&";","")&IF(AO9,$D9&";","")&IF(AP9,$E9&";",""),AQ9),"") =LEN(AR9)-LEN(SUBSTITUTE(AR9,";","")) =AG9-AS9 =IF(AI9,B9,"") =IF(AJ9,C9,"") =IF(AK9,D9,"") =IF(AL9,E9,"") =IFERROR(IF(COLUMNS($AZ9:AZ9)>$AT9,"",AGGREGATE(15,6,$AV9:$AY9,COLUMNS($AZ9:AZ9))&";"),"") =IFERROR(IF(COLUMNS($AZ9:BA9)>$AT9,"",AGGREGATE(15,6,$AV9:$AY9,COLUMNS($AZ9:BA9))&";"),"") =IFERROR(IF(COLUMNS($AZ9:BB9)>$AT9,"",AGGREGATE(15,6,$AV9:$AY9,COLUMNS($AZ9:BB9))&";"),"") =IFERROR(IF(COLUMNS($AZ9:BC9)>$AT9,"",AGGREGATE(15,6,$AV9:$AY9,COLUMNS($AZ9:BC9))&";"),"") =R9&AE9&AR9&AZ9&BA9&BB9&BC9 =(LEN($BD9)-LEN(SUBSTITUTE($BD9,B9&";","")))/2 =(LEN($BD9)-LEN(SUBSTITUTE($BD9,C9&";","")))/2 =(LEN($BD9)-LEN(SUBSTITUTE($BD9,D9&";","")))/2 =(LEN($BD9)-LEN(SUBSTITUTE($BD9,E9&";","")))/2 =SUM(BE9:BH9)

Here is a different approach where I've tried to share the units in accordance with demand, while giving some priority to the higher ranks.

Method - Starting with the highest ranked store, share the remaining units out in accordance with the demands of the remaining stores. If the result for the current store is not a whole number, round it up. Then re-evaluate the remaining units for the next store in the same way. The basic formula is

Remaining Units / Remaining demand * Current demand

=LET(ranks,B2:E2, demands,F2:I2, avail,K2, seq,SEQUENCE(1,4), INDEX(DROP(REDUCE(0,seq, LAMBDA(a,c,HSTACK(a,ROUNDUP((avail-SUM(a))/ SUMIFS(demands,ranks,">="&c)*XLOOKUP(c,ranks,demands),0)))),,1),ranks))

SKU Store 1 Rank Store 2 Rank Store 3 Rank Store 4 Rank Store 1 Demand Store 2 Demand Store 3 Demand Store 4 Demand Total Demand Available Store 1 Store 2 Store 3 Store 4
Test1 1 2 3 4 10 10 10 10 40 3 1 1 1 0
Test2 1 2 3 4 10 10 10 10 40 7 2 2 2 1
Socks #1 1 4 3 2 5 7 8 2 22 10 3 2 4 1
Socks #2 4 3 2 1 3 2 4 1 10 1 0 0 0 1
Socks #3 4 3 2 1 3 7 5 4 19 3 0 1 1 1
Socks #4 1 2 3 4 5 5 5 8 23 30 7 7 7 9
Socks #5 4 3 2 1 6 1 2 7 16 15 5 1 2 7
Socks #6 1 2 3 4 0 2 0 5 7 4 0 2 0 2
Socks #7 2 4 3 1 0 0 0 8 8 0 #DIV/0! #DIV/0! #DIV/0! #DIV/0!
Socks #8 1 2 3 4 1 2 3 4 10 9 1 2 3 3

Where total amount available exceeds total demand e.g. for Socks#4, there should be a check that amount issued for each shop does not exceed demand:

=LET(ranks,B7:E7,demands,F7:I7,avail,K7,seq,SEQUENCE(1,4),INDEX(DROP(REDUCE(0,seq,LAMBDA(a,c,HSTACK(a,ROUNDUP(MIN(1,(avail-SUM(a))/SUMIFS(demands,ranks,">="&c))*XLOOKUP(c,ranks,demands),0)))),,1),ranks))

If you were to add a check for the availability being zero, the whole thing would look like this:

=LET(ranks,B2:E2, demands,F2:I2, avail,K2, seq,SEQUENCE(1,4), INDEX(DROP(REDUCE(0,seq,LAMBDA(a,c,HSTACK(a, IFERROR(ROUNDUP(MIN(1,(avail-SUM(a))/SUMIFS(demands,ranks,">="&c))*XLOOKUP(c,ranks,demands),0),0)))),,1),ranks))

与本文相关的文章

发布评论

评论列表(0)

  1. 暂无评论