Requête avec jointure externe - SQL/NoSQL - Programmation
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 :
|
Ta difficulté à obtenir un résultat peut venir de là.
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
Marsh Posté le 03-03-2008 à 11:36:27
Je partirais vers quelquechose comme ca (peut etre à adapter un peu)
Code :
|
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
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