Skip to content

Variations de stock

octobre 27, 2012

Problème: un service reçoit l’état d’un stock, jour après jour, et doit calculer les variations quotidiennes de ce stock.
Les informations sont stockées dans une table stock ayant la structure suivante
stock(stock_id,stock_date, stock_qty)
Avec les champs:
stock_id: la clé primaire de la table, en numérotation automatique. Pour la requête qui va suivre, il est important que toutes les lignes de la table soient numérotées séquentiellement.
stock_date: la date à laquelle la quantité en stock a été relevée
stock_qty: la quantité en stock
Pour calculer la variation du stock, la requête sql doit « se débrouiller » pour avoir sur la même ligne, la quantité en stock du jour courant et la quantité en stock de la veille.
Ceci est obtenu en faisant correspondre une ligne de la table stock, avec la ligne du jour précédent. Pour cela, une première requête sur la table stock fourni une colonne stock_id_previous dont les valeurs sont égales à [stock_id]-1 , qui est l’identifiant de la ligne correspondant au jour précédent.

select stock.stock_date, stock.stock_qty , stock.stock_id,
[stock_id]-1 as stock_id_previous
from stock

Le résultat de cette requête, considérée comme une table à qui on donne l’alias stock_today , fourni la quantité en stock du jour.
Cette table est ensuite jointe à la table stock, a qui on donne l’alias stock_yesterday, car elle fourni les enregistrements de la veille.
La jointure se fait sur l’égalité entre clés primaires suivantes:
stock_today.stock_id_previous=stock_yesterday.stock_id
Permettant ainsi de mettre en relation une ligne courante avec la ligne du jour précédent.
La requête complète est la suivante:
select stock_today.stock_date, stock_today.stock_qty, stock_yesterday.stock_qty,
(stock_today.stock_qty-stock_yesterday.stock_qty) as [variation du stock]
from (
select stock.stock_date, stock.stock_qty , stock.stock_id,
[stock_id]-1 as stock_id_previous
from stock
) as stock_today,
(
select stock.stock_date, stock.stock_qty , stock.stock_id
from stock
) as stock_yesterday
where stock_today.stock_id_previous=stock_yesterday.stock_id;

Ou, avec la clause INNER JOIN
select stock_today.stock_date, stock_today.stock_qty, stock_yesterday.stock_qty,
(stock_today.stock_qty-stock_yesterday.stock_qty) as [variation du stock]
from (
select stock.stock_date, stock.stock_qty , stock.stock_id, [stock_id]-1 as stock_id_previous
from stock
) as stock_today inner join stock as stock_yesterday
on stock_today.stock_id_previous=stock_yesterday.stock_id;

Soit la table stock avec le contenu suivant

La requête donne les résultats suivants

On voit que pour le 01/11/2012, il n’y a pas de variation, car pas de valeur de stock pour la veille.
De même, pas de variation calculée pour le 09/11/2012, car la ligne d’identifiant 6 a été supprimée. C’est une limitation de cette requête.

Publicités

From → Requêtes SQL

Laisser un commentaire

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :