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 badges3 Answers
Reset to default 1Using 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))