Bonjour à tous,
Je me tourne vers vous car j'ai une requête à coder et j'ai eu beau suivre tous les tutoriaux trouvés sur internet, je ne m'en sors pas...
Je dispose de 3 tables dont voici la structure :
table site table stock table statarticle
---------- ----------- -----------------
numerosite numerosite numerosite
nomsite clefarticle clefarticle
qtestock qtevendue
clefprimaire datevente
clefprimaire
J'aimerais obtenir dans un même tableau la qtestock et la qtevendue par article par site sur une certaine période, mais je n'y arrive pas !
Mon tableau devra donc être constitué des 4 colonnes suivantes : clefarticle,nomsite,qtestock,qtevendue
Les relations entre tables étant bien sûr que :
site.numerosite = stock.numerosite
stock.numerosite = statarticle.numerosite
site.numerosite = statarticle.numerosite
stock.clefarticle = statarticle.clefarticle
Je vais limiter mon exemple à une valeur prédéfinie pour clefarticle (871620), et à une période donnée.
1. Pour obtenir les valeurs issues de ma table stock pour l'article '871620', je fais tout simplement :
select clefarticle,nomsite,qtestock from stock,site where (stock.numerosite=site.numerosite) and (clefarticle='871620');
ce qui me donne pour résultat :
+-------------+---------+----------+
| clefarticle | nomsite | qtestock |
+-------------+---------+----------+
| 871620 | SITE1 | 5.00 |
| 871620 | SITE2 | 61.00 |
| 871620 | SITE3 | 9.00 |
+-------------+---------+----------+
2. Pour obtenir les valeurs issues de ma table statarticle pour l'article '871620' sur la période du 01/01/08 au 31/01/08, je fais tout simplement :
select clefarticle,nomsite,SUM(quantitevendue) as 'QV' from statarticle,site where (statarticle.numerosite=site.numerosite) and (datevente between '2008-01-01' and '2008-01-31') and (clefarticle='871620') group by statarticle.numerosite;
ce qui me donne pour résultat :
+-------------+---------+--------+
| clefarticle | nomsite | QV |
+-------------+---------+--------+
| 871620 | SITE1 | 1.0000 |
| 871620 | SITE2 | 3.0000 |
+-------------+---------+--------+
3. Pour obtenir le tableau combiné des deux, j'utilise la requête suivante :
select statarticle.clefarticle,nomsite,SUM(statarticle.quantitevendue) as 'QV',stock.qtestock from statarticle,stock,site where (statarticle.clefarticle=stock.clefarticle) and (statarticle.numerosite=stock.numerosite) and (statarticle.numerosite=site.numerosite) and (datevente between '2008-01-01' and '2008-01-31') and (statarticle.clefarticle='871620') group by statarticle.numerosite;
ce qui me donne pour résultat :
+-------------+---------+--------+----------+
| clefarticle | nomsite | QV | qtestock |
+-------------+---------+--------+----------+
| 871620 | SITE1 | 1.0000 | 5.00 |
| 871620 | SITE2 | 3.0000 | 61.00 |
+-------------+---------+--------+----------+
mais il me manque donc les informations sur le SITE3 !!!
Pour résoudre ce problème, et donc garder les lignes issues de la table stock pour lesquelles il n'y a pas de correspondance dans la table statarticle, j'ai vu qu'il fallait utiliser une jointure externe. Voici donc ma requête corrigée (sans la table site car je n'ai pas su comment faire avec...):
select statarticle.clefarticle,statarticle.numerosite,SUM(statarticle.quantitevendue) as 'QV',stock.qtestock from statarticle RIGHT JOIN stock USING (clefarticle,numerosite) where (datevente between '2008-01-01' and '2008-01-31') and (statarticle.clefarticle='871620') group by statarticle.numerosite;
ce qui me donne exactement le même résultat que ci-dessus sans avoir utilisé de jointure externe... donc ma jointure n'est apparemment pas reconnue...
De plus, je ne sais pas comment utiliser ma table site dans cette requête pour garder la correspondance avec le nom du site...
Comment faire pour obtenir le tableau suivant qui est mon objectif ?
+-------------+---------+--------+----------+
| clefarticle | nomsite | QV | qtestock |
+-------------+---------+--------+----------+
| 871620 | SITE1 | 1.0000 | 5.00 |
| 871620 | SITE2 | 3.0000 | 61.00 |
| 871620 | SITE3 | NULL | 9.00 |
+-------------+---------+--------+----------+
Merci d'avance pour votre aide, je ne m'en sors pas...
Cordialement,
Delphine