reformulation de requete

reformulation de requete - SQL/NoSQL - Programmation

Marsh Posté le 27-03-2008 à 11:25:17    

Bonjour à tous.
Bloquant depuis hier sur la formulation d'une requéte SQL et ne trouvant pas de réponse satisfaisante, je me résous à appeler au secours.
Pour simplifier un maximum, j'ai 3 tables.
table fournisseur avec les champs id_fournisseur (INT), societe (VARCHAR)
table article avec id_article(INT), id_fournisseur(INT), stock (INT)
table article_achat avec id_achat(INT), id_article(INT), date_achat(DATE), prix_achat(FLOAT)
Important: dans la table article_achat, pour un même id_article, je peux avoir plusieurs enregistrements avec des date_achat et prix_achat différents (c'est d'ailleurs la source du problème)
 
Je voudrais faire une requête qui, pour chaque fournisseur, me fournit le total du stock et la somme correspondante.
Pour le stock, pas de pb:
SELECT fournisseur.id_fournisseur,fournisseur.societe AS nom_societe, SUM(article.stock) AS total_stock
FROM fournisseur
INNER JOIN article ON (article.id_fournisseur=fournisseur.id_fournisseur)
GROUP BY fournisseur.id_fournisseur
ORDER BY fournisseur.societe
 
Par contre, pour, dans la même requéte (en décomposant, je sais faire, mais je voudrais tout en une requête unique) obtenir mon SUM( article_achat.prix_achat * article.stock ), je suis censé faire un INNER JOIN sur la table article_achat pour récupérer la ligne correspondant au prix_achat le plus récent de l'article, et faire fi des autres. Logiquement, ca devrait donner qqch du genre
 
SELECT fournisseur.id_fournisseur,fournisseur.societe AS nom_societe, SUM(article.stock) AS total_stock
FROM fournisseur
INNER JOIN article ON (article.id_fournisseur=fournisseur.id_fournisseur)
INNER JOIN article_achat ON (article.id_article=article_achat.id_article AND  
article_achat.date_debut=(SELECT MAX(date_debut) FROM article_achat WHERE article_achat.id_article=article.id_article))
GROUP BY fournisseur.id_fournisseur
ORDER BY fournisseur.societe
 
Cette requête est erronée sur le deuxième INNER JOIN. Quelqu'un saurait-il la formuler correctement pour obtenir le résultat désiré?

Reply

Marsh Posté le 27-03-2008 à 11:25:17   

Reply

Marsh Posté le 27-03-2008 à 13:32:12    

C'est pas la bonne catégorie pour poster ton sujet.  :o


---------------
Directeur Technique (CTO)
Reply

Marsh Posté le 27-03-2008 à 15:12:00    

C'est corrige.

Reply

Marsh Posté le 27-03-2008 à 16:58:43    

Deux réponses, et aucune pour régler mon problème  :ange:  
Du coup, je tente de simplifier au maximum.
 
Une seule table nommée article_achat
4 colonnes: id_achat (de type INT), id_article (INT), date_debut (DATE), prix_achat (FLOAT)
 
Je veux récupérer mon id_article et le prix_achat associé, mais pour chaque article, je ne veux que le prix_achat le plus récent
 
Si je fais un
 
SELECT id_article, date_debut, prix_achat
FROM article_achat
 
je me retrouve avec par exemple 2 lignes ayant 8383 pour id_article
8383   2005-02-18   1.1
8383  2006-08-10  1.187
Or ne m'intéresse que la seconde car son date_debut est plus récent.
Je veux donc, pour chaque id_article, le prix associé à la date la plus récente, et ne pas recevoir les autres.
 
Je sais le faire en plusieurs lignes:
SELECT DISTINCT id_article FROM article_achat
puis pour chaque id_article,
SELECT prix_achat FROM article_achat WHERE id_article=\"".$id_article."\" ORDER BY date_achat DESC LIMIT 1
 
Je voudrais le faire en une seule.
Est-ce que quelqu'un peut m'aider?


Message édité par danidan75 le 27-03-2008 à 16:59:19
Reply

Marsh Posté le 27-03-2008 à 17:01:13    

Pardon d'augmenter tes chances d'avoir des reponses, la prochaine fois je laisserai ton topic ou il est. [:kiki]

Reply

Marsh Posté le 28-03-2008 à 02:19:21    

t'as pas le droit de faire une sous-requête dans une clause de jointure.
 
dans ta requête qui plante, sors ton "select max()" et colle-le dans la clause where, ça devrait passer.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed