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

Bases de données Delphi Discussion :

Jointure de 3 tables


Sujet :

Bases de données Delphi

  1. #1
    Membre éclairé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    1 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Points : 681
    Points
    681
    Par défaut Jointure de 3 tables
    Bonjour,

    J'ai la requete suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT commande_client.num_commande,commande_client.code_cli,commande_client.date_commande,Client.Nom_Cli,
    Sum((detail_commande_client.qte_cde*detail_commande_client.pu_vente_ht)*detail_commande_client.taux_tva)
    AS SommeTva,Sum(detail_commande_client.qte_cde*detail_commande_client.pu_vente_ht) As MontanthT
    FROM commande_client LEFT JOIN detail_commande_client ON commande_client.num_commande = detail_commande_client.num_commande
    GROUP BY commande_client.num_commande,commande_client.date_commande
    Elle calcule et affiche la somme des details d'1 commande client
    J'aimerais ajouter la table client dans la jointure et je n'arrive pas à la mettre à l'endroit correct ca m'affiche tjrs des erreurs j'ai meme fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    where commande_client.code_cli = client.code_cli
    merci pour votre aide
    Si quelqu'un t'a offensé, ne cherche pas à te venger; assieds-toi au bord de la rivière et, bientôt, tu verras passer son cadavre.

    Lao Tseu - un sage chinois

    Celui qui lutte contre les monstres doit veiller à ne pas le devenir lui-même.
    Et quand ton regard pénètre longtemps au fond d'un abîme, l'abîme, lui aussi, pénètre en toi.

    Friedrich Nietzsche - Par délà le bien et le mal

  2. #2
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Essaie comme ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT 
    cc.num_commande,cc.code_cli,cc.date_commande,c.Nom_Cli,Sum((dcc.qte_cde*dcc.pu_vente_ht)*dcc.taux_tva)
    AS SommeTva,Sum(dcc.qte_cde*dcc.pu_vente_ht) As MontanthT
    FROM 
      commande_client as cc 
        LEFT JOIN detail_commande_client as dcc ON cc.num_commande = dcc.num_commande
        inner join client as c on cc.code_cli = c.code_cli 
    GROUP BY cc.num_commande,cc.date_commande,c.Nom_Cli
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  3. #3
    Membre éclairé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    1 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Points : 681
    Points
    681
    Par défaut
    merci Malatar
    Je crois que je l'ai essayer et ca ma donner erreur de syntaxe et comme je vais sortir du travail j'essayerais ta solution ce soir et je te confirme ce soir
    Si quelqu'un t'a offensé, ne cherche pas à te venger; assieds-toi au bord de la rivière et, bientôt, tu verras passer son cadavre.

    Lao Tseu - un sage chinois

    Celui qui lutte contre les monstres doit veiller à ne pas le devenir lui-même.
    Et quand ton regard pénètre longtemps au fond d'un abîme, l'abîme, lui aussi, pénètre en toi.

    Friedrich Nietzsche - Par délà le bien et le mal

  4. #4
    Membre éclairé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    1 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Points : 681
    Points
    681
    Par défaut
    et non ca ne marche pas ca donne :
    erreur de syntaxe (operateur absent) dans l'expression 'ON cc.num_commande = dcc.num_commande
    inner join client as c on cc.code_cli = c.code_cli'
    Si quelqu'un t'a offensé, ne cherche pas à te venger; assieds-toi au bord de la rivière et, bientôt, tu verras passer son cadavre.

    Lao Tseu - un sage chinois

    Celui qui lutte contre les monstres doit veiller à ne pas le devenir lui-même.
    Et quand ton regard pénètre longtemps au fond d'un abîme, l'abîme, lui aussi, pénètre en toi.

    Friedrich Nietzsche - Par délà le bien et le mal

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 27
    Points : 19
    Points
    19
    Par défaut
    Salut,

    Cela ne ressemble pas à une question delphi mais plutot SQL.
    Est-ce bien du SQL que tu veux faire ?
    Alors essaie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT commande_client.num_commande,...............
    FROM commande_client ,detail_commande_client ,client
    where commande_client.num_commande = detail_commande_client.num_commande
    and commande_client.code_cli = client.code_cli
    GROUP BY ..................
    Cela dépend aussi de ton SGBD.

  6. #6
    Membre éclairé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    1 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Points : 681
    Points
    681
    Par défaut
    excusez c'est du sql dans delphi avec BD access
    Si quelqu'un t'a offensé, ne cherche pas à te venger; assieds-toi au bord de la rivière et, bientôt, tu verras passer son cadavre.

    Lao Tseu - un sage chinois

    Celui qui lutte contre les monstres doit veiller à ne pas le devenir lui-même.
    Et quand ton regard pénètre longtemps au fond d'un abîme, l'abîme, lui aussi, pénètre en toi.

    Friedrich Nietzsche - Par délà le bien et le mal

  7. #7
    Membre éclairé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    1 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Points : 681
    Points
    681
    Par défaut
    j'utilise un adoquery :

    avec ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT commande_client.num_commande,commande_client.code_cli,commande_client.date_commande,client.nom_cli,
    Sum((detail_commande_client.qte_cde*detail_commande_client.pu_vente_ht)*detail_commande_client.taux_tva)
    AS SommeTva,Sum(detail_commande_client.qte_cde*detail_commande_client.pu_vente_ht) As MontanthT
    FROM commande_client , detail_commande_client where commande_client.num_commande = detail_commande_client.num_commande
    and  commande_client.code_cli=client.code_cli
    GROUP BY commande_client.num_commande,commande_client.code_cli,
    commande_client.date_commande,client.nom_cli
    j'ai le message :

    le paramètre client.nom_cli n'as pas de paramètre par défaut
    Si quelqu'un t'a offensé, ne cherche pas à te venger; assieds-toi au bord de la rivière et, bientôt, tu verras passer son cadavre.

    Lao Tseu - un sage chinois

    Celui qui lutte contre les monstres doit veiller à ne pas le devenir lui-même.
    Et quand ton regard pénètre longtemps au fond d'un abîme, l'abîme, lui aussi, pénètre en toi.

    Friedrich Nietzsche - Par délà le bien et le mal

  8. #8
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par mesquest

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT commande_client.num_commande,...............
    FROM commande_client ,detail_commande_client ,client
    where commande_client.num_commande = detail_commande_client.num_commande
    and commande_client.code_cli = client.code_cli
    GROUP BY ..................
    Ecriture déconseillé pour les performances, il faut préférer utiliser les jointures avec Inner join, Lef Join, etc...


    Pour revenir sur la requete

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    SELECT 
    cc.num_commande,cc.code_cli,cc.date_commande,c.Nom_Cli,Sum(dcc.qte_cde*dcc.pu_vente_ht*dcc.taux_tva)
    AS SommeTva,Sum(dcc.qte_cde*dcc.pu_vente_ht) As MontanthT
    FROM 
      (commande_client as cc LEFT JOIN detail_commande_client as dcc ON cc.num_commande = dcc.num_commande )
        inner join client as c on cc.code_cli = c.code_cli 
    GROUP BY cc.num_commande,cc.date_commande,c.Nom_Cli
    Essai comme ca avec les parenthèse en plus. Sinon fait voir le code où tu implémentes cette requete car autant l'erreur est la.

    Citation Envoyé par freud

    j'ai le message :

    le paramètre client.nom_cli n'as pas de paramètre par défaut
    Un message comme ca, veut dire que soit tu n'as pas le bon nom de la table, soit le nom du champs n'existe pas. donc il faut que tu vérifies cela.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  9. #9
    Membre éclairé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    1 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Points : 681
    Points
    681
    Par défaut
    Bonjour et merci

    Initialement ma requete etait (c'est le codage que j'avais) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT cc.num_commande,cc.code_cli,cc.date_commande,
    Sum(dcc.qte_cde*dcc.pu_vente_ht*dcc.taux_tva) AS SommeTva,
    Sum(dcc.qte_cde*dcc.pu_vente_ht) As MontanthT FROM
    (commande_client as cc LEFT JOIN detail_commande_client as dcc ON cc.num_commande = dcc.num_commande )
    GROUP BY cc.num_commande,cc.code_cli,cc.date_commande
    Je voulais rajouter la table des clients pour recuperer leurs noms puisque le code_client est une clé etrangere dans la table commande.

    que j'ai inserer dans la proprtiété SQL de l'ADOQUERY.

    J'ai du la changer pour mettre WHERE avec AND
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT commande_client.num_commande,commande_client.code_cli,commande_client.date_commande,client.nom_cli,
    Sum((detail_commande_client.qte_cde*detail_commande_client.pu_vente_ht)*detail_commande_client.taux_tva)
    AS SommeTva,Sum(detail_commande_client.qte_cde*detail_commande_client.pu_vente_ht) As MontanthT
    FROM commande_client , detail_commande_client,client where (commande_client.num_commande = detail_commande_client.num_commande)
    and  (commande_client.code_cli=client.code_cli)
    GROUP BY commande_client.num_commande,commande_client.code_cli,commande_client.date_commande,client.nom_cli
    et que ca marche maintenant a cause des parenthèse qui manquaient sans avoir le message d'erreur mais la table commande client est vide à l'affichage et ca m'affiche toutes les lignes de details de toutes les commandes.

    Malatar, j'ai essayer ta requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT cc.num_commande,cc.code_cli,cc.date_commande,c.Nom_Cli,
    Sum(dcc.qte_cde*dcc.pu_vente_ht*dcc.taux_tva) AS SommeTva,
    Sum(dcc.qte_cde*dcc.pu_vente_ht) As MontanthT FROM
    (commande_client as cc LEFT JOIN detail_commande_client as dcc ON cc.num_commande = dcc.num_commande )
    inner join client as c on cc.code_cli = c.code_cli
    GROUP BY cc.num_commande,cc.code_cli,cc.date_commande,c.Nom_Cli
    avec les parenthèses ca fonctionne sauf que c'est la meme chose, elle ne me renvois pas les lignes de commande clients.
    Si quelqu'un t'a offensé, ne cherche pas à te venger; assieds-toi au bord de la rivière et, bientôt, tu verras passer son cadavre.

    Lao Tseu - un sage chinois

    Celui qui lutte contre les monstres doit veiller à ne pas le devenir lui-même.
    Et quand ton regard pénètre longtemps au fond d'un abîme, l'abîme, lui aussi, pénètre en toi.

    Friedrich Nietzsche - Par délà le bien et le mal

  10. #10
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Normal si tu n'as pas de client pour une commande il n'affichera rien a cause de Inner join.
    Si tu veux que ca affiche les commandes même sans qu'il existe un client alors remplace le par un Left Join


    Rappel :

    - Tab1 inner join Tab2 : ne seront afficher que les enregistrements dont la clef de jointure existe dans les deux tables.
    - Tab1 Left Join Tab2 : Comme pour l'inner join, mais si il n'y a pas de correspondance d'un enregistrement de la Tab1 avec la Tab2, alors on l'affiche quand même
    - Tab1 Right Join Tab2 : C'est l'inverse du Left Join
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  11. #11
    Membre éclairé Avatar de freud
    Homme Profil pro
    Développeur
    Inscrit en
    Mai 2002
    Messages
    1 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 271
    Points : 681
    Points
    681
    Par défaut
    mille excuse Malatar ta requete marche trés bien le champ code client dans la table commande etait vide. C'est pour cela que j'avais des lignes vides
    Merci beaucoup et merci pour le rappel
    Si quelqu'un t'a offensé, ne cherche pas à te venger; assieds-toi au bord de la rivière et, bientôt, tu verras passer son cadavre.

    Lao Tseu - un sage chinois

    Celui qui lutte contre les monstres doit veiller à ne pas le devenir lui-même.
    Et quand ton regard pénètre longtemps au fond d'un abîme, l'abîme, lui aussi, pénètre en toi.

    Friedrich Nietzsche - Par délà le bien et le mal

+ Répondre à la discussion
Cette discussion est résolue.

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, 14h50
  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, 15h03
  3. jointure sur TROIS tables
    Par caribou_belle dans le forum Langage SQL
    Réponses: 8
    Dernier message: 01/03/2004, 11h20
  4. Jointure entre 2 tables et OR
    Par PyRoFlo dans le forum Requêtes
    Réponses: 2
    Dernier message: 02/02/2004, 18h42
  5. Jointure sur 2 tables de bases différentes
    Par Celina dans le forum Langage SQL
    Réponses: 10
    Dernier message: 10/11/2003, 11h56

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