2010-01-07 2 views
0

J'ai deux tableaux: un des produits d'attente et un des mouvements d'inventaire connexes.obtenir la liste des produits en stock à une date donnée

table de produit:

Seq | Name | Barcode 

table Déplacer:

Seq | ProductFK | Direction | Date 

Chaque produit peut avoir plusieurs et/ou OUT déplacer les enregistrements.
Comment puis-je obtenir une liste de tous les produits en stock à une date donnée?

J'ai essayé ce qui suit, mais cela ne fonctionne pas s'il y a plus d'un IN et OUT se déplace:

SELECT DISTINCT Product.* , Move.* FROM Product LEFT JOIN Move ON Product.Seq=Move.StockFK where not exists (select * from Move where Product.Seq=Move.StockFK and Direction = "OUT") 

Quelqu'un peut-il me aider sur ce s'il vous plaît. J'utilise MySQL 5.1.

+0

Est-ce que chaque enregistrement de mouvement indique le mouvement de 1 unité de produit, ou vous manque un champ de quantité? – Don

Répondre

0

J'ai peut-être mal compris votre question.

Chaque fois que vous avez "IN" il suffit d'ajouter le nombre de stock par un. Chaque fois qu'il y a "OUT" il suffit de le soustraire par un. La différence est le stock?

SELECT ProductFK, SUM(IF(m.direction='IN'))-SUM(IF(m.direction='OUT')) AS stock 
FROM Move m WHERE m.Date < '20090101' AND stock > 0 

Cela devrait le faire, maintenant il suffit de le joindre avec votre table de produit si vous le souhaitez.

Si vous avez omis un champ de quantité, modifiez simplement les IF SUM.

0

Vous pouvez créer un cube OLAP avec l'inventaire, les transactions et l'heure en tant que dimensions. Je suis un mec de MSSQL, donc je ferais tout cela dans Reporting Server, mais je suis certain qu'il existe aussi des analyseurs de cube MySQL.

recherche rapide Google suggère: www.ramsetcube.com

1

Il y a un problème fondamental avec la colonne direction étant texte/varchar, ne contenant que « dans » et/ou des valeurs « out ». Il n'y a aucun moyen de connaître les chiffres impliqués, ce qui signifie qu'il n'y a aucun moyen de savoir si le stock existe un jour donné. Si le type de données était un nombre, vous pouvez additionner (en supposant que le stock sortant est négatif) les colonnes pour une date donnée.

En supposant que la colonne de direction a utilisé un type de données numériques, utilisez:

SELECT p.seq, 
     p.name, 
     p.barcode, 
     x.stock_onhand 
    FROM PRODUCTS p 
    JOIN (SELECT m.productfk, 
       SUM(m.direction) 'stock_onhand' 
      FROM MOVE m 
     WHERE DAY(m.date) = ? 
      AND MONTH(m.date) = ? 
      AND YEAR(m.date) = ? 
     GROUP BY m.productfk, 
       DAY(m.date), 
       MONTH(m.date), 
       YEAR(m.date)) x ON x.productfk = p.seq 

Parce que les DATETIME & types de données timestamp comprennent la partie de temps, vous devez utiliser des fonctions pour isoler la date. En raison de l'utilisation d'une fonction sur la colonne, un index sur la colonne date n'a pas pu être utilisé - en supposant qu'il en existait un.

+0

Donc, si la colonne de direction est un nombre (1 pour in et -1 pour out je suppose) comment aurais-je obtenir la liste de prodruct en stock à un jour donné? – Flo

+0

J'ai datetime divisé en 2 colonnes: colonne de date et d'heure (l'heure est juste pour l'information d'utilisateur quand le prod est balayé) Ainsi, il n'y a pas besoin d'utiliser les fonctions de date que je suppose. Je ne connais que le SQL de base, mais je pense que je vois ce que vous voulez dire après quelques expériences. J'apprécie vraiment votre aide – Flo

0

Merci OMG Poneys et eckesicle: J'ai trouvé qu'une combinaison de vos réponses m'a fourni une solution de travail:

SELECT p.Seq, 
     p.Barcode, 
     x.stock_onhand 
    FROM Product p 
    JOIN (SELECT ProductFK, SUM(IF(m.Direction='IN',1,0))-SUM(IF(m.Direction='OUT',1,0)) 'stock_onhand' 
     FROM Move m WHERE m.Date < "2010/01/19" GROUP BY ProductFK) 
    x ON x.ProductFK = p.Seq where stock_onhand>0 
Questions connexes