Requête avec jointure externe

Requête avec jointure externe - SQL/NoSQL - Programmation

Marsh Posté le 29-02-2008 à 16:53:44    

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

Reply

Marsh Posté le 29-02-2008 à 16:53:44   

Reply

Marsh Posté le 29-02-2008 à 17:10:18    

Je pense qu'il y a un soucis dans tes tables, ou peut être que je ne comprends pas tout.... Pourquoi as-tu le numéro de site dans la table statarticle ?
Parce que tes liaisons sont du coup illogique (celles au niveau de numerosite) :

dpin a écrit :


    table site            table stock             table statarticle
    ----------            -----------           -----------------
|-> numerosite  <---->  numerosite  <----> numerosite <---|
|    nomsite                clefarticle <------>  clefarticle        |
|                           qtestock                 qtevendue          |
|                           clefprimaire              datevente          |
|                                                        clefprimaire         |
|__________________________________________________|


Ta difficulté à obtenir un résultat peut venir de là.


Message édité par babasss le 29-02-2008 à 17:10:53

---------------
Feedback : http://forum.hardware.fr/hfr/Achat [...] 2666_1.htm
Reply

Marsh Posté le 03-03-2008 à 09:58:03    

Bonjour,
 
Mes tables sont correctes, c'est juste que la clé primaire de chaque table est différente de clefarticle et numerosite.
Pour avoir correspondance entre mes tables stock et statarticle, il me faut bien avoir le même numerosite et la même clefarticle.
 
Pour que tu comprennes mieux, j'ai plusieurs sites qui réalisent des ventes d'article. Ma table statarticle comporte les quantités vendues de tous les articles sur tous les sites pour chaque date. Donc la clé primaire serait en fait composée par (numerosite,clefarticle,datevente).
Ma table stock m'indique les articles qui sont en stock sur chaque site. La clé primaire est donc composée de (numerosite,clefarticle).
 
Je veux obtenir un tableau m'indiquant pour un article précis et une date de vente précise, la quantité en stock de cet article sur chaque site avec la quantité vendue correspondante sur chaque site à la date indiquée.
 
Merci pour votre aide, car je n'arrive pas à réaliser cette requête...
 
Cordialement,
 
Delphine

Reply

Marsh Posté le 03-03-2008 à 11:36:27    

Je partirais vers quelquechose comme ca (peut etre à adapter un peu)

Code :
  1. SELECT statarticle.clefarticle, nomsite, sum(qtestock) AS QS, sum(qtevendue) AS QV
  2. FROM stock
  3.  INNER JOIN site ON stock.numerosite = site.numerosite
  4.  INNER JOIN statarticle ON stock.numerosite = statarticle.numerosite
  5.  INNER JOIN statarticle ON stock.clefarticle = statarticle.clefarticle
  6. WHERE (datevente BETWEEN '2008-01-01' AND '2008-01-31')
  7.  AND (clefarticle='871620')
  8. GROUP BY statarticle.numerosite, statarticle.clefarticle;


---------------
Feedback : http://forum.hardware.fr/hfr/Achat [...] 2666_1.htm
Reply

Marsh Posté le 03-03-2008 à 13:53:27    

Ta requête ne fonctionne pas hélas, je vais chercher encore.
Merci tout-de-même d'avoir regardé...
 
Cordialement,
 
Delphine

Reply

Sujets relatifs:

Leave a Replay

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