Nous souhaitons connaître l’âge de notre stock, pour chaque article qui le compose.
La difficulté, c’est que nous n’attendons généralement pas d’être en rupture de stock pour nous réapprovisionner. Si c’était le cas, notre stock aurait l’âge de la dernière réception, fin de l’histoire.
Non non, dans la vie réelle, notre stock est composé d’articles qui ont été réceptionnés en quantités variables à différentes dates.
Règles de calcul
On pourrait se dire que l’âge de notre stock est l’âge du plus « ancien » article qui le compose, ce qui pourrait avoir du sens d’un point de vue métier.
Mais nous allons appliquer une autre règle : calculer un âge de stock pondéré. Avec cette méthode, on considère que le stock est géré en mode « FIFO » (« First In, First Out »), c’est à dire que les articles les plus anciens sont consommés ou vendus en priorité.
Pour illustrer cette règle, prenons l’exemple suivant :
- j’ai 10 articles en stock
- 12 ont été reçus il y a 11 jours
- 7 ont été reçus il y a 9 jours
- 2 ont été reçus il y a 5 jours
Pour calculer l’âge pondéré du stock, il faut appliquer un « poids » sur les articles en fonction de leur âge, en considérant les réceptions de la plus récente à la plus ancienne, jusqu’à avoir « couvert » tous mes articles actuellement en stock :
- ( [ 2 articles de poids = 5] + [ 7 articles de poids = 9] + [ 1 articles de poids = 11 ] ) / [nombre d’articles en stock = 10]
- ( ( 2 * 5 ) + ( 7 * 9 ) + ( 1 * 11 ) ) / 10
- 8,4 jours
Jeu de données d’exemple
Table RECEPTIONS
Article | Date | Quantité réceptionnée |
---|---|---|
Article A | 2023-01-29 | 50 |
Article B | 2023-01-25 | 300 |
Article A | 2023-01-22 | 30 |
Article B | 2023-01-15 | 400 |
Article A | 2023-01-10 | 50 |
Article A | 2023-01-05 | 20 |
Table STOCK
Article | Stock actuel |
---|---|
Article A | 100 |
Article B | 500 |
Étape 1 : somme cumulée des mouvements
Pour commencer, afin de savoir quel âge (ou poids) donner à chaque unité de mon stock, je dois identifier les quantités réceptionnées à considérer, ainsi que leur date de réception.
Pour ce faire, l’idée est de réaliser une somme cumulative des mouvements, du plus récent au plus ancien, pour chaque article.
De cette façon, en comparant cette somme cumulative à mon stock actuel, je vais savoir quelles réceptions prendre en compte pour calculer l’âge de mon stock, et quelles réceptions sont trop anciennes et ne doivent pas être considérées dans le calcul.
Structure cible
On souhaite donc arriver au résultat ci-dessous, avec, pour chaque article, la somme cumulée des réceptions, par ordre décroissant de la date de réception :
Article | Date | Quantité récep. cumulée | Quantité récep. (rappel) |
---|---|---|---|
Article A | 2023-01-29 | 50 (0+50) | 50 |
Article A | 2023-01-22 | 80 (50+30) | 30 |
Article A | 2023-01-10 | 130 (80+50) | 50 |
Article A | 2023-01-05 | 150 (130+20) | 20 |
Article B | 2023-01-25 | 300 (0+300) | 300 |
Article B | 2023-01-15 | 700 (300+400) | 400 |
C’est la clause « OVER » et les fonction de partitionnement et de tri « PARTITION BY » et « ORDER BY » qui vont nous permettre de réaliser cette somme cumulée (documentation ici, vous y trouverez également le fonctionnement du « UNBOUNDED PRECEDING » , qui permet de jouer avec l’ordre des lignes dans les partition du jeu de résultats).
Voici, dans notre cas, la requête permettant d’arriver au résultat vu plus haut :
Etape 2 : filtrage des mouvements inutiles
Calculer la quantité réceptionnée cumulée par date descendante, jusqu’à ce que la quantité réceptionnée cumulée dépasse le stock actuel.
Gérer le cas où la somme des mouvements cumulés est supérieure à mon stock actuel