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

Requêtes MySQL Discussion :

probleme de jointure


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 24
    Points : 14
    Points
    14
    Par défaut probleme de jointure
    j'ai deux table mysql :
    credit1(id,annee,id_p,id_h,montant)
    credit2(id,annee,id_p,montant)
    je voudrais avoir la somme des sum(montant) des deux tables pour chaque annee, alors je met la requete suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select sum(credit1.montant) , sum(credit2.montant) , credit1.annee 
    from credit1, credit2 
    where credit1.annee=credit2.annee 
      and credit1.id_p=credit2.id_p
    le probleme qu'il me retourne les sum erronées.
    SVP si quelqu'un sait d'où vient le probleme (alors que les jointure que j'ai mis sont correcte)

  2. #2
    En attente de confirmation mail
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Octobre 2010
    Messages
    501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2010
    Messages : 501
    Points : 1 060
    Points
    1 060
    Par défaut
    Bonsoir,

    Pour calculer les sommes correctement il faut regrouper les montants: clause GROUP BY credit1.annee
    Ca donne ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT SUM(credit1.montant) , SUM(credit2.montant) , credit1.annee
    FROM credit1, credit2 
    WHERE credit1.annee=credit2.annee AND credit1.id_p=credit2.id_p 
    GROUP BY credit1.annee

  3. #3
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    Bonsoir,

    une jointure correcte ne s'effectue pas avec un WHERE.

    Voir ici

  4. #4
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 24
    Points : 14
    Points
    14
    Par défaut
    meme si j'utilise le INNER JOINT j'ai le meme probleme

  5. #5
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    Les fonctions telles que SUM, AVG, MIN etc sont des fonctions d'aggrégation qui nécessite d'utiliser en même temps des GROUP BY comme te l'a dit Nudger. Quel est l'état de ta requête actuelle avec INNER JOIN ?
    Montre la nous stp

  6. #6
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 24
    Points : 14
    Points
    14
    Par défaut
    j'ai testé avec le group by mais toujour le meme probleme je vais vous montrez un exemple pour comprendre mon probleme:
    lorsque je met les deux requetes suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT SUM(montant), annee from credit1 group by annee
    le résultat est:
    172764619.00 2010
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT SUM(montant), annee from credit2 group by annee
    le résultat est:
    337443436.00 2010

    mais lorsque je regroupe les sommes dans une seul requete:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT Sum( credit1.montant ) , Sum( credit2.montant) , credit1.annee, credit2.annee
    FROM credit1 ,credit2
    WHERE credit1.annee = credit2.annee
    AND credit1.id_p = credit2.id_p
    GROUP BY  credit1.annee
    j'ai le resultat:
    172764619.00 2010
    401443436.00 2010

    alors si vous remarquez, le deuxieme montant qui est erroné ,celui de la table credit2 qui ne contient pas la cle étrangere id_h.

  7. #7
    En attente de confirmation mail
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Octobre 2010
    Messages
    501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2010
    Messages : 501
    Points : 1 060
    Points
    1 060
    Par défaut
    Bonsoir,

    Une colonne a été ajoutée par rapport à la première requête: credit2.annee.
    Il faut l'ajouter à la clause GROUP BY.

  8. #8
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 24
    Points : 14
    Points
    14
    Par défaut
    oui je la mentionne dans ma requete sauf que je l'ai oublié de l'écrire ici.

  9. #9
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    Citation Envoyé par Madfrix Voir le message
    Bonsoir,

    une jointure correcte ne s'effectue pas avec un WHERE.

    Voir ici

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT SUM( credit1.montant ) , SUM( credit2.montant) , credit1.annee, credit2.annee
    FROM credit1 
    INNER JOIN credit2
    ON credit1.annee = credit2.annee
    AND credit1.id_p = credit2.id_p
    GROUP BY  credit1.annee, credit2.annee

    Même si ca risque de rien changer, autant prendre les bonnes habitudes

  10. #10
    Modérateur

    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
    Tu as peut-être plusieurs montants pour la même année et le même id_p dans une des deux tables ?

    Je reprends la structure :
    credit1(id,annee,id_p,id_h,montant)
    credit2(id,annee,id_p,montant)
    J'y mets des données fictives :

    credit1(id,annee,id_p,id_h,montant)
    1, 2009, 1, 1, 1000
    2, 2009, 1, 2, 500
    => Somme des montants de crédit1 pour l'année 2009 et l'id_p 1 : 1500

    credit2(id,annee,id_p,montant)
    1, 2009, 1, 300
    => Somme des montants de crédit2 pour l'année 2009 et l'id_p 1 : 300

    Je joins les deux tables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT c1.id AS id1, c1.annee AS annee1, c1.id_p AS idp1, c1.id_h AS idh1, c1.montant AS montant1,
        c2.id AS id2, c2.annee AS annee2, c2.id_p AS idp2, c2.montant AS montant2
    FROM credit1 AS c1
    INNER JOIN credit2 AS c2 ON c2.id_p = c1.id_p AND c2.annee = c1.annee
    Résultat :
    id1, annee1, idp1, idh1, montant1 / id2, annee2, idp2, montant2
    1, 2009, 1, 1, 1000 / 1, 2009, 1, 300
    2, 2009, 1, 2, 500 / 1, 2009, 1, 300
    => Somme des montants de crédit1 pour l'année 2009 et l'id_p 1 : 1500
    => Somme des montants de crédit2 pour l'année 2009 et l'id_p 1 : 600

    Ce qu'il faut faire, c'est joindre les deux sous-requêtes qui donnent la somme pour chaque table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT t1.annee1 AS annee, t1.idp1 AS id_p, t1.Somme1, t2.Somme2
    FROM 
    (
        SELECT c1.annee AS annee1, c1.id_p AS idp1, SUM(c1.montant) AS Somme1
        FROM credit1 AS c1
        GROUP BY c1.annee, c1.id_p
    ) AS t1
    INNER JOIN 
    (
        SELECT c2.annee AS annee2, c2.id_p AS idp2, SUM(c2.montant) AS Somme2
        FROM credit2 AS c2
        GROUP BY c2.annee, c2.id_p
    ) AS t2 
        ON t2.annee2 = t1.annee1 AND t2.idp2 = t2.idp1

  11. #11
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 24
    Points : 14
    Points
    14
    Par défaut
    oui merci votre requete marche trés bien

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

Discussions similaires

  1. Probleme en jointure
    Par angelayoub dans le forum Langage SQL
    Réponses: 1
    Dernier message: 09/01/2006, 15h07
  2. [MySQL] probleme de jointure entre 2 tables
    Par guy2004 dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 30/10/2005, 14h11
  3. Probleme de jointure externe ...
    Par amenis dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 06/09/2005, 09h59
  4. Probleme de Jointures imbriquées dans une requête
    Par Crevin dans le forum Langage SQL
    Réponses: 3
    Dernier message: 13/04/2005, 11h05
  5. PROBLEME DE JOINTURE ENTRE DEUX TABLE
    Par DarkMax dans le forum Langage SQL
    Réponses: 13
    Dernier message: 13/01/2005, 15h11

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