reformulation de requete - SQL/NoSQL - Programmation
Marsh Posté le 27-03-2008 à 13:32:12
ReplyMarsh Posté le 27-03-2008 à 16:58:43
Deux réponses, et aucune pour régler mon problème
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?
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.
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.
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é?