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 :
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 !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 table site ---------- numerosite nomsite table stock ----------- numerosite clefarticle qtestock clefprimaire table statarticle ----------------- numerosite clefarticle qtevendue datevente clefprimaire
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 :
ce qui me donne pour résultat :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 select clefarticle,nomsite,qtestock from stock,site where (stock.numerosite=site.numerosite) and (clefarticle='871620');
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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 +-------------+---------+----------+ | clefarticle | nomsite | qtestock | +-------------+---------+----------+ | 871620 | SITE1 | 5.00 | | 871620 | SITE2 | 61.00 | | 871620 | SITE3 | 9.00 | +-------------+---------+----------+
ce qui me donne pour résultat :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 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;
3. Pour obtenir le tableau combiné des deux, j'utilise la requête suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 +-------------+---------+--------+ | clefarticle | nomsite | QV | +-------------+---------+--------+ | 871620 | SITE1 | 1.0000 | | 871620 | SITE2 | 3.0000 | +-------------+---------+--------+
ce qui me donne pour résultat :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 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;
mais il me manque donc les informations sur le SITE3 !!!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 +-------------+---------+--------+----------+ | clefarticle | nomsite | QV | qtestock | +-------------+---------+--------+----------+ | 871620 | SITE1 | 1.0000 | 5.00 | | 871620 | SITE2 | 3.0000 | 61.00 | +-------------+---------+--------+----------+
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...):
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...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 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;
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 ?
Merci d'avance pour votre aide, je ne m'en sors pas...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 +-------------+---------+--------+----------+ | clefarticle | nomsite | QV | qtestock | +-------------+---------+--------+----------+ | 871620 | SITE1 | 1.0000 | 5.00 | | 871620 | SITE2 | 3.0000 | 61.00 | | 871620 | SITE3 | NULL | 9.00 | +-------------+---------+--------+----------+
Cordialement,
Delphine
Partager