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 :

requete deux tables avec sum erreur calcul


Sujet :

Requêtes MySQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 47
    Points : 35
    Points
    35
    Par défaut requete deux tables avec sum erreur calcul
    Bonjour, afin de conserver quelques cheveux, et comme je débute sur les requetes pourriez vous m'aider :

    je dois réunir deux tables avec des sommes dans la jointure

    TABLE M :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Numero	garage	brut
    21225	gare1	10
    21225	gare2	25,2
    21225	gare3	12
    21225	gare4	35,6
    21225	gare5	14
    21225	gare6	15
    21225	gare1	52
    21225	gare2	15,24
    21225	gare3	18
    21225	gare4	19
    21225	gare5	20
    21225	gare6	21

    TABLE B
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Numero	garage	presta
    21225	gare1	26,2
    21225	gare2	36
    21225	gare3	58,4
    21225	gare4	236
    21225	gare5	25,6
    21225	gare6	75
    21225	gare1	15
    21225	gare2	36
    21225	gare3	58,4
    21225	gare4	19
    21225	gare5	20
    21225	gare6	21


    mes requètes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT  m.`Numero`,m.`garage`,sum( m.`brut`) FROM sp.m m
    where m.`Numero`='21225'
    GROUP BY  m.`Numero`,m.`garage`
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT  b.`Numero`,b.`garage`,sum(`presta`)
    FROM sn.b b
    where b.`Numero`='21225'
    GROUP BY b.`Numero`,b.`garage`
    Les deux requetes fonctionnent correctement, mais des que je les relie
    pour obtenir normalement

    Numero garage brut presta
    21225 gare1 62 41,2
    21225 gare2 40,44 72
    21225 gare3 30 116,8
    21225 gare4 54,6 255
    21225 gare5 34 45,6
    21225 gare6 36 96
    j'obteint des résultats qui sont multipliés par le nombre de lignes de la seconde base et jamais le résulat ci-dessus.

    Pourriez-vous m'aider car j'ai essayé beaucoup de choses et je toure en rond

    Merci d'avance

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    Essaye ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Brut.Numero, Brut.garage, Brut.sumbrut AS brut, Presta.sumpresta AS presta FROM 
    (SELECT m.Numero, m.garage, SUM(m.brut) as sumbrut FROM m GROUP BY m.Numero, m.garage) Brut,
    (SELECT b.Numero, b.garage, SUM(b.presta) as sumpresta FROM b GROUP BY b.Numero, b.garage) Presta
    WHERE Brut.Numero=Presta.Numero AND Brut.garage=Presta.garage
    (peut-etre pas optimal)

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 47
    Points : 35
    Points
    35
    Par défaut requete deux tables avec sum erreur calcul
    Merci utoz07, ta requête est bien mais il y a un hic, c'est que si la ligne garage est vide , il ne retourne pas de valeur.

    TABLE M :
    Numero garage brut
    21225 gare7 10
    21225 gare8 25,2
    21225 gare9 12
    21225 NULL 35,6

    TABLE B

    Numero garage presta
    21225 NULL 26,2
    21225 NULL 36

    lors de ta requête il ne renvoie que les valeurs qui ont des résultats des deux côtés donc le calcul est bon....mais pas le résultat .

    Aurais-tu une idée?

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Vite fait, il faut utiliser une jointure externe.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT M.Numero, M.garage,
        SUM (M.brut) AS somme_brut,
        SUM (B.presta) AS somme_presta
    FROM M
    LEFT OUTER JOIN B ON B.Numero = M.Numero AND B.garage = M.garage
    GROUP BY M.Numero, M.garage
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 47
    Points : 35
    Points
    35
    Par défaut
    Merci CinePhil, j'en étais arrivé à ce stade, malheureusement c'est à ce niveau que lorsque les deux requetes se rejoignent que brut se multiplie.

    Si la valeur de m n'existe pas dans b (brut est ok)
    Si la valeur de m existe dans b brut (se mulplie par x) mais presta ok

    Il faudait que j'arrive à lier la réponse de utoz07 à ta requète....

    avec un peu de nurofen .....

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    OK, j'avais dit vite fait donc c'était mal fait !

    On va faire plus simple avec une union de tes deux requêtes d'origine :
    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
    SELECT t.numero, t.garage, 
        SUM(somme_brut) AS somme_brut,
        SUM(somme_presta) AS somme_presta
    FROM (
        SELECT  m.Numero, m.garage, 
            sum( m.brut) AS somme_brut, 
            0 AS somme_presta
        FROM sp.m m
        WHERE m.Numero = '21225'
        GROUP BY  m.Numero, m.garage
     
        UNION
     
        SELECT  b.Numero, b.garage,
            0 AS comme_brut,
            sum(b.presta) AS somme_presta
        FROM sn.b b
        WHERE b.Numero = '21225'
        GROUP BY b.Numero, b.garage
    ) t
    GROUP BY t.numero, t.garage
    C'est encore un peu du vite fait mais j'espère que cette fois c'est bon ou que ça te conduit sur la bonne piste.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 47
    Points : 35
    Points
    35
    Par défaut requete deux tables avec sun calcul
    Merci à einstein et à ses coéquipiers.

    En effet le résultat est parfait.

    Merci à vous deux, une formation rapide à de multiples conditions.

    J'arrête le café jusqu'à la prochaine prise de tête.

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 47
    Points : 35
    Points
    35
    Par défaut requetes deux tables avec sum erreur calcul
    Après avoir bien compris ta requête CinePhil, et comblé des lacunes, la solution Union me laisse perplexe car
    si on a deux tables avec des nombres de colonnes différentes et
    piocher des donnees dans M et d'autre dans B , tout secouer dans le shaker, et obtenir un résulat c'est impossible.

    Je sais, je deviens difficile, mais j'aimerais juste apprendre à relier les requêtes mysql, car je faisais tout ca par code sur des datatable temporaires avant, et devant la puissance de mysql j'ai envie de dompter la bête .

  9. #9
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Décris plus précisément ton besoin, peut-être dans une nouvelle discussion si le besoin est différent, afin que nous puissions mieux t'aider.

    Mais c'est vrai que UNION ne fonctionne qu'avec des colonnes de même type et qu'il ne fera aucune difficulté pour mélanger les torchons et les serviettes (une colonne "pseudo" avec une colonne "telephone" si ces deux colonnes sont de type VARCHAR(10) par exemple). Attention donc à la signification de ce l'on unit !

    C'est vrai aussi que tu obtiendras généralement de meilleures performances en faisant faire les traitements de données au SGBD plutôt qu'au code du logiciel utilisateur. Les SGBD sont quand même fais pour ça !

    Bon courage !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 47
    Points : 35
    Points
    35
    Par défaut requete deux tabls avec sum erreur de calcul
    Merci pour tes encouragements,

    Je reprends les tables
    TABLE M :
    Numero garage brut
    21225 gare7 10
    21225 gare8 25,2
    21225 gare9 12
    21225 NULL 35,6

    TABLE B

    Numero garage presta codea
    21225 gare3 58,4 100
    21225 gare4 19 100
    21225 gare5 20 100
    21225 gare6 21 100
    21225 NULL 26,2 100
    21225 NULL 36 100

    En reprenant ta solution, j'essaye d'obtenir

    Numero garage brut presta codea
    21225 gare1 62 41,2 100
    21225 gare2 40,44 72 100
    21225 gare3 30 116,8 100
    21225 gare4 54,6 255 100
    21225 gare5 34 45,6 100
    21225 gare6 36 96 100

    Donc à partir de ta requête il faut que j'arrive à faire un (je pense) RIGHT OUTER JOIN
    pour obtenir le résultat.
    Et comme je risque d'être viscieuse je vais après penser que codea peux être différent.

  11. #11
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par letel Voir le message
    En reprenant ta solution, j'essaye d'obtenir

    Numero garage brut presta codea
    21225 gare1 62 41,2 100
    21225 gare2 40,44 72 100
    21225 gare3 30 116,8 100
    21225 gare4 54,6 255 100
    21225 gare5 34 45,6 100
    21225 gare6 36 96 100

    Donc à partir de ta requête il faut que j'arrive à faire un (je pense) RIGHT OUTER JOIN
    pour obtenir le résultat.
    Ou un LEFT OUTER JOIN, ça dépend dans quel sens tu écris ta requête.

    Et comme je risque d'être viscieuse je vais après penser que codea peux être différent.
    Vite fait, en ajoutant codea dans le GROUP BY, ça ne donne pas ce que tu cherches ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 47
    Points : 35
    Points
    35
    Par défaut requete deux tables avec sum erreur de calcul
    CinePhil, j'ai beau essayer dans tous les sens, pour rajouter mes informations maiss je dépose les armes car aucun résulat n'est concluant.

    J'ai réussi grâce à toi à raccrocher 8 années par lignes, et avec les autres conditions, mais je là je sèche pour rajouter les colonnes de B inexistantes dans m.



    Pourrais-tu m'aider sur l'emplacement de la jointure

  13. #13
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Tout comme dans ma requête j'avais ajouté dans les sous-requêtes une colonne à zéro pour avoir le même nombre de colonnes dans l'UNION, si j'ai bien compris ton besoin, je pense qu'il faut ajouter artificiellement la colonne codea à vide puis l'ajouter au GROUP BY général :
    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
    SELECT t.numero, t.garage, 
        SUM(somme_brut) AS somme_brut,
        SUM(somme_presta) AS somme_presta
    FROM (
        SELECT  m.Numero, m.garage, '' AS codea,
            sum( m.brut) AS somme_brut, 
            0 AS somme_presta
        FROM sp.m m
        WHERE m.Numero = '21225'
        GROUP BY  m.Numero, m.garage
     
        UNION
     
        SELECT  b.Numero, b.garage, b.codea,
            0 AS comme_brut,
            sum(b.presta) AS somme_presta
        FROM sn.b b
        WHERE b.Numero = '21225'
        GROUP BY b.Numero, b.garage
    ) t
    GROUP BY t.numero, t.garage, t.codea
    Vite fait, à tester.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

Discussions similaires

  1. requete sur deux tables avec join et coalesce
    Par nifufu dans le forum Requêtes
    Réponses: 14
    Dernier message: 10/02/2009, 13h51
  2. requete sur 4 tables avec sum et soustration
    Par afroweb dans le forum Requêtes et SQL.
    Réponses: 15
    Dernier message: 23/01/2009, 16h28
  3. Requetes sur deux tables avec plusieurs retour
    Par IP-Fix dans le forum Requêtes
    Réponses: 16
    Dernier message: 13/11/2008, 18h46
  4. Réponses: 1
    Dernier message: 20/02/2008, 11h34
  5. Croisement de deux tables avec SUM et sans doublon
    Par ar|equin dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 13/06/2007, 17h52

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