IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Jointure de 3 tables?


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Inscrit en
    Septembre 2007
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 20
    Points : 18
    Points
    18
    Par défaut Jointure de 3 tables?
    Bonjour,
    Je voudrais faire la jointure de 3 tables:
    -Table Articles (code,prix,stock,....)
    -Table Entrées (Code,quantité_e,prix_e,date_e...)
    -Table Sorties (Code,quantité_s,prix_s,date_s...)
    Et avoir à la fin une requête qui donne un resultat ou il y'a tout les articles avec entrées ou sorties du genre
    Date_e ou date_s ... Code ... Quantité_e ...prix_e...... Quantité_s.....prix_s
    01/01/09............... A1........... 2 ..............5,600.............................
    02/01/09............... A2................................................4.............2,700
    02/01/09............... A2............3...............4,800.............................
    30/01/09............... A7............1...................................................
    04/01/09............... A9................................................6 ............1,000
    etc.....
    Pourriez-vous m'aider SVP

  2. #2
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Avez-vous commencé une requête ?
    A quel moment bloquez-vous ?
    Avez vous cherché des réponses dans un tutoriel tel que celui-ci ?

  3. #3
    Membre à l'essai
    Inscrit en
    Septembre 2007
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 20
    Points : 18
    Points
    18
    Par défaut
    Bonjour,
    J'ai fait la requête suivante mais j'ai un resultat bizarre (répétition) car pour chaque entrée j'ai toutes les sorties etc..
    Voici la requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select  a.code_a,ISNULL(e.quantite_e,0) as Q_entree,e.prix_a,e.date_e,ISNULL(s.quantite_s,0) as Q_sortie,s.prix_u,s.date_s from article a 
    join entree_s  e on  a.n_art=e.n_art 
    join sortie_s s on  a.n_art=s.n_art 
    where a.n_art='800' and e.date_e<= '21/01/2009' and e.date_e>= '01/01/2008' and s.date_s<= '21/01/2009' and s.date_s>= '01/01/2008'  
    order by date_e,date_s
    Merci.

  4. #4
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Je ne connais pas l'opérateur ISNULL en SQL. Par contre il existe IS NULL qui retourne un résultat booléen.

    Si je comprends ce que vous voulez faire, il faut utiliser COALESCE.

    Ensuite, au lieu de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND e.date_e <= '21/01/2009' AND e.date_e >= '01/01/2008'
    Il existe BETWEEN.

    Si a.n_art est l'identifiant de l'article, il devrait être de type entier non null non signé auto-incrémenté. Inutile alors de mettre des ' autour de la valeur cherchée dans le WHERE.

    Le format de date est normalement 'aaaa-mm-jj'.

    Essayez cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT  a.code_a, 
        COALESCE(e.quantite_e, 0) AS Q_entree, e.prix_a AS Prix_entree, e.date_e AS Date_entree,
        COALESCE(s.quantite_s,0) AS Q_sortie, s.prix_u AS Prix_sortie, s.date_s AS Date_sortie
    FROM article a 
    INNER JOIN entree_s  e ON  a.n_art = e.n_art 
    INNER JOIN sortie_s s ON  a.n_art = s.n_art 
    WHERE a.n_art = 800 
        AND e.date_e BETWEEN '2008-01-01' AND  '2009/01/21'
        AND s.date_s BETWEEN '2008-01-01' AND  '2009/01/21'
    ORDER BY date_e, date_s
    Vous travaillez avec quel SGBD ?

  5. #5
    Membre à l'essai
    Inscrit en
    Septembre 2007
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 20
    Points : 18
    Points
    18
    Par défaut
    je travaille avec SQL Server 2005.
    ISNULL fonctionne très bien. En revanche la date doit être de la forme 'jj/mm/aaaa'.
    Mais ça ne fonctionne toujours pas.
    Avec cette requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT  a.code_a, 
        COALESCE(e.quantite_e, 0) AS Q_entree, e.prix_a AS Prix_entree, e.date_e AS Date_entree,
        COALESCE(s.quantite_s,0) AS Q_sortie, s.prix_u AS Prix_sortie, s.date_s AS Date_sortie
    FROM article a 
    INNER JOIN entree_s  e ON  a.n_art = e.n_art 
    INNER JOIN sortie_s s ON  a.n_art = s.n_art 
    WHERE a.n_art = 800 
        AND e.date_e BETWEEN '01/01/2008' AND  '21/01/2009'
        AND s.date_s BETWEEN '01/01/2008' AND  '21/01/2009'
    ORDER BY date_e, date_s
    j'ai obtenu ce resultat pour l'article n°800 (6305 ZZ):
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    6305 ZZ          	10	10.846	2008-02-04 00:00:00.000	8	10.8466666666667	2008-02-16 11:03:14.000
    6305 ZZ          	10	10.846	2008-02-04 00:00:00.000	3	10.8466666666667	2008-02-29 12:22:27.000
    6305 ZZ          	10	10.846	2008-02-04 00:00:00.000	3	10.8466666666667	2008-03-18 16:18:44.000
    6305 ZZ          	10	10.846	2008-02-04 00:00:00.000	1	10.8460606060606	2008-04-30 10:17:32.000
    6305 ZZ          	10	10.846	2008-02-04 00:00:00.000	2	10.8460606060606	2008-05-31 14:33:40.000
    6305 ZZ          	10	10.846	2008-02-04 00:00:00.000	3	10.8460606060606	2008-08-30 09:30:20.000
    6305 ZZ          	10	10.846	2008-02-04 00:00:00.000	6	10.4100303030303	2008-09-29 15:14:31.000
    6305 ZZ          	10	10.846	2008-02-04 00:00:00.000	5	10.0985800865801	2008-10-30 12:28:52.000
    6305 ZZ          	10	10.846	2008-02-04 00:00:00.000	6	10.0487480519481	2008-11-29 09:13:34.000
    6305 ZZ          	10	10.846	2008-02-04 00:00:00.000	1	10.049	2008-12-11 00:00:00.000
    6305 ZZ          	10	10.846	2008-02-04 00:00:00.000	1	10.0487480519481	2008-12-25 00:00:00.000
    6305 ZZ          	10	10.846	2008-02-04 00:00:00.000	1	10.0487480519481	2008-12-25 00:00:00.000
    6305 ZZ          	10	10.846	2008-04-22 00:00:00.000	8	10.8466666666667	2008-02-16 11:03:14.000
    6305 ZZ          	10	10.846	2008-04-22 00:00:00.000	3	10.8466666666667	2008-02-29 12:22:27.000
    6305 ZZ          	10	10.846	2008-04-22 00:00:00.000	3	10.8466666666667	2008-03-18 16:18:44.000
    6305 ZZ          	10	10.846	2008-04-22 00:00:00.000	1	10.8460606060606	2008-04-30 10:17:32.000
    6305 ZZ          	10	10.846	2008-04-22 00:00:00.000	2	10.8460606060606	2008-05-31 14:33:40.000
    6305 ZZ          	10	10.846	2008-04-22 00:00:00.000	3	10.8460606060606	2008-08-30 09:30:20.000
    6305 ZZ          	10	10.846	2008-04-22 00:00:00.000	6	10.4100303030303	2008-09-29 15:14:31.000
    6305 ZZ          	10	10.846	2008-04-22 00:00:00.000	5	10.0985800865801	2008-10-30 12:28:52.000
    6305 ZZ          	10	10.846	2008-04-22 00:00:00.000	6	10.0487480519481	2008-11-29 09:13:34.000
    6305 ZZ          	10	10.846	2008-04-22 00:00:00.000	1	10.049	2008-12-11 00:00:00.000
    6305 ZZ          	10	10.846	2008-04-22 00:00:00.000	1	10.0487480519481	2008-12-25 00:00:00.000
    6305 ZZ          	10	10.846	2008-04-22 00:00:00.000	1	10.0487480519481	2008-12-25 00:00:00.000
    6305 ZZ          	5	9.974	2008-09-04 00:00:00.000	8	10.8466666666667	2008-02-16 11:03:14.000
    6305 ZZ          	5	9.974	2008-09-04 00:00:00.000	3	10.8466666666667	2008-02-29 12:22:27.000
    6305 ZZ          	5	9.974	2008-09-04 00:00:00.000	3	10.8466666666667	2008-03-18 16:18:44.000
    6305 ZZ          	5	9.974	2008-09-04 00:00:00.000	1	10.8460606060606	2008-04-30 10:17:32.000
    6305 ZZ          	5	9.974	2008-09-04 00:00:00.000	2	10.8460606060606	2008-05-31 14:33:40.000
    6305 ZZ          	5	9.974	2008-09-04 00:00:00.000	3	10.8460606060606	2008-08-30 09:30:20.000
    6305 ZZ          	5	9.974	2008-09-04 00:00:00.000	6	10.4100303030303	2008-09-29 15:14:31.000
    6305 ZZ          	5	9.974	2008-09-04 00:00:00.000	5	10.0985800865801	2008-10-30 12:28:52.000
    6305 ZZ          	5	9.974	2008-09-04 00:00:00.000	6	10.0487480519481	2008-11-29 09:13:34.000
    6305 ZZ          	5	9.974	2008-09-04 00:00:00.000	1	10.049	2008-12-11 00:00:00.000
    6305 ZZ          	5	9.974	2008-09-04 00:00:00.000	1	10.0487480519481	2008-12-25 00:00:00.000
    6305 ZZ          	5	9.974	2008-09-04 00:00:00.000	1	10.0487480519481	2008-12-25 00:00:00.000
    6305 ZZ          	6	9.974	2008-10-13 00:00:00.000	8	10.8466666666667	2008-02-16 11:03:14.000
    6305 ZZ          	6	9.974	2008-10-13 00:00:00.000	3	10.8466666666667	2008-02-29 12:22:27.000
    6305 ZZ          	6	9.974	2008-10-13 00:00:00.000	3	10.8466666666667	2008-03-18 16:18:44.000
    6305 ZZ          	6	9.974	2008-10-13 00:00:00.000	1	10.8460606060606	2008-04-30 10:17:32.000
    6305 ZZ          	6	9.974	2008-10-13 00:00:00.000	2	10.8460606060606	2008-05-31 14:33:40.000
    6305 ZZ          	6	9.974	2008-10-13 00:00:00.000	3	10.8460606060606	2008-08-30 09:30:20.000
    6305 ZZ          	6	9.974	2008-10-13 00:00:00.000	6	10.4100303030303	2008-09-29 15:14:31.000
    6305 ZZ          	6	9.974	2008-10-13 00:00:00.000	5	10.0985800865801	2008-10-30 12:28:52.000
    6305 ZZ          	6	9.974	2008-10-13 00:00:00.000	6	10.0487480519481	2008-11-29 09:13:34.000
    6305 ZZ          	6	9.974	2008-10-13 00:00:00.000	1	10.049	2008-12-11 00:00:00.000
    6305 ZZ          	6	9.974	2008-10-13 00:00:00.000	1	10.0487480519481	2008-12-25 00:00:00.000
    6305 ZZ          	6	9.974	2008-10-13 00:00:00.000	1	10.0487480519481	2008-12-25 00:00:00.000
    6305 ZZ          	4	9.974	2008-10-28 00:00:00.000	8	10.8466666666667	2008-02-16 11:03:14.000
    6305 ZZ          	4	9.974	2008-10-28 00:00:00.000	3	10.8466666666667	2008-02-29 12:22:27.000
    6305 ZZ          	4	9.974	2008-10-28 00:00:00.000	3	10.8466666666667	2008-03-18 16:18:44.000
    6305 ZZ          	4	9.974	2008-10-28 00:00:00.000	1	10.8460606060606	2008-04-30 10:17:32.000
    6305 ZZ          	4	9.974	2008-10-28 00:00:00.000	2	10.8460606060606	2008-05-31 14:33:40.000
    6305 ZZ          	4	9.974	2008-10-28 00:00:00.000	3	10.8460606060606	2008-08-30 09:30:20.000
    6305 ZZ          	4	9.974	2008-10-28 00:00:00.000	6	10.4100303030303	2008-09-29 15:14:31.000
    6305 ZZ          	4	9.974	2008-10-28 00:00:00.000	5	10.0985800865801	2008-10-30 12:28:52.000
    6305 ZZ          	4	9.974	2008-10-28 00:00:00.000	6	10.0487480519481	2008-11-29 09:13:34.000
    6305 ZZ          	4	9.974	2008-10-28 00:00:00.000	1	10.049	2008-12-11 00:00:00.000
    6305 ZZ          	4	9.974	2008-10-28 00:00:00.000	1	10.0487480519481	2008-12-25 00:00:00.000
    6305 ZZ          	4	9.974	2008-10-28 00:00:00.000	1	10.0487480519481	2008-12-25 00:00:00.000
    6305 ZZ          	6	9.974	2008-11-12 00:00:00.000	8	10.8466666666667	2008-02-16 11:03:14.000
    6305 ZZ          	6	9.974	2008-11-12 00:00:00.000	3	10.8466666666667	2008-02-29 12:22:27.000
    6305 ZZ          	6	9.974	2008-11-12 00:00:00.000	3	10.8466666666667	2008-03-18 16:18:44.000
    6305 ZZ          	6	9.974	2008-11-12 00:00:00.000	1	10.8460606060606	2008-04-30 10:17:32.000
    6305 ZZ          	6	9.974	2008-11-12 00:00:00.000	2	10.8460606060606	2008-05-31 14:33:40.000
    6305 ZZ          	6	9.974	2008-11-12 00:00:00.000	3	10.8460606060606	2008-08-30 09:30:20.000
    6305 ZZ          	6	9.974	2008-11-12 00:00:00.000	6	10.4100303030303	2008-09-29 15:14:31.000
    6305 ZZ          	6	9.974	2008-11-12 00:00:00.000	5	10.0985800865801	2008-10-30 12:28:52.000
    6305 ZZ          	6	9.974	2008-11-12 00:00:00.000	6	10.0487480519481	2008-11-29 09:13:34.000
    6305 ZZ          	6	9.974	2008-11-12 00:00:00.000	1	10.049	2008-12-11 00:00:00.000
    6305 ZZ          	6	9.974	2008-11-12 00:00:00.000	1	10.0487480519481	2008-12-25 00:00:00.000
    6305 ZZ          	6	9.974	2008-11-12 00:00:00.000	1	10.0487480519481	2008-12-25 00:00:00.000

  6. #6
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    Ce que te dit CinePhil, c'est que COALESCE est la norme.

    En gros, utilises COALESCE qui fait la même chose que ISNULL.
    Fais la même chose pour toutes les fonctions spécifiques SQL Server qui ont un équivalent dans la norme.

    Et le jour où tu changeras de SGBD, ça te limitera beaucoup l'effort d'adaptation...

    Pour le reste, si ton problème est juste le format de la date, tu as la fonction CONVERT qui te transforme ta date en chaîne de caractères selon le format que tu souhaites...

    Le tutoriel complet sur les formats de dates :
    http://baptiste-wicht.developpez.com...-sql/datetime/

  7. #7
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Je comprends mieux votre besoin de départ :
    Date_e ou date_s ... Code ... Quantité_e ...prix_e...... Quantité_s.....prix_s
    01/01/09............... A1........... 2 ..............5,600.............................
    02/01/09............... A2................................................4.............2,700
    02/01/09............... A2............3...............4,800.............................
    30/01/09............... A7............1...................................................
    04/01/09............... A9................................................6 ............1,000
    Vous souhaitez en fait que chaque ligne affiche soit l'entrée, soit la sortie, mais pas les deux pour ne pas répéter les entrées, lesquelles sont en bien moins grand nombre que les sorties.

    Il faut donc faire une union de deux requêtes et ordonner le tout par date.

    1ère requête : les entrées
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT  a.code_a, e.date_e AS Date_mouvement
        COALESCE(e.quantite_e, 0) AS Q_entree, e.prix_a AS Prix_entree, 
        NULL AS Q_sortie, NULL AS Prix_sortie
    FROM article a 
    INNER JOIN entree_s  e ON  a.n_art = e.n_art
    2ème requête : les sorties
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT  a.code_a, e.date_e AS Date_mouvement
        NULL AS Q_entree, NULL AS Prix_entree, 
        COALESCE(s.quantite_s,0) AS Q_sortie, s.prix_u AS Prix_sortie
    FROM article a 
    INNER JOIN sortie_s s ON  a.n_art = s.n_art
    On réunit les deux et on restreint à l'article et à la période :
    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
    SELECT code_a, Date_mouvement, Q_entree, Prix_entree, Q_sortie, Prix_sortie
    FROM (
    SELECT  a.code_a, e.date_e AS Date_mouvement
        COALESCE(e.quantite_e, 0) AS Q_entree, e.prix_a AS Prix_entree, 
        NULL AS Q_sortie, NULL AS Prix_sortie
    FROM article a 
    INNER JOIN entree_s  e ON  a.n_art = e.n_art 
    UNION
    SELECT  a.code_a, e.date_e AS Date_mouvement
        NULL AS Q_entree, NULL AS Prix_entree, 
        COALESCE(s.quantite_s,0) AS Q_sortie, s.prix_u AS Prix_sortie
    FROM article a 
    INNER JOIN sortie_s s ON  a.n_art = s.n_art 
    ) tmp
    WHERE tmp.n_art = 800 
        AND tmp.Date_mouvement BETWEEN '2008-01-01' AND  '2009/01/21'
    Vous pouvez aussi essayer de mettre les restrictions dans les deux requêtes de l'union. Ce sera peut-être plus rapide si vous avez une grande quantité de données. A tester.

Discussions similaires

  1. Jointure entre deux tables et résultat
    Par Asdorve dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/06/2004, 15h50
  2. [jointure]requete possible de double jointure entre 2 tables
    Par akira_le_gaucher dans le forum Langage SQL
    Réponses: 4
    Dernier message: 11/05/2004, 16h03
  3. jointure sur TROIS tables
    Par caribou_belle dans le forum Langage SQL
    Réponses: 8
    Dernier message: 01/03/2004, 12h20
  4. Jointure entre 2 tables et OR
    Par PyRoFlo dans le forum Requêtes
    Réponses: 2
    Dernier message: 02/02/2004, 19h42
  5. Jointure sur 2 tables de bases différentes
    Par Celina dans le forum Langage SQL
    Réponses: 10
    Dernier message: 10/11/2003, 12h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo