Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1675 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  reformulation de requete

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

reformulation de requete

n°1708581
danidan75
Posté le 27-03-2008 à 11:25:17  profilanswer
 

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é?

mood
Publicité
Posté le 27-03-2008 à 11:25:17  profilanswer
 

n°1708691
CyberDenix
Posté le 27-03-2008 à 13:32:12  profilanswer
 

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


---------------
Directeur Technique (CTO)
n°1708753
Elmoricq
Modérateur
Posté le 27-03-2008 à 15:12:00  profilanswer
 

C'est corrige.

n°1708828
danidan75
Posté le 27-03-2008 à 16:58:43  profilanswer
 

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
n°1708832
Elmoricq
Modérateur
Posté le 27-03-2008 à 17:01:13  profilanswer
 

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

n°1709018
MagicBuzz
Posté le 28-03-2008 à 02:19:21  profilanswer
 

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.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  reformulation de requete

 

Sujets relatifs
Requete LDAPDeux fois la même sous requête sous MySQL
Requéte demi-merdique[Builder 6]récpere le résultat d'une requête SQL d'un composant TQuery
Pb requete sql avec MySQL 4.0.25Requete a modifier pour optimiser
(débutant) mise en page requete SQL.Requête SQL
erreur 3664 pour une requete sql avec la fonction openrecordsetHelp pour requête SQL
Plus de sujets relatifs à : reformulation de requete


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR