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 :

SUM sur trois tables


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2008
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 69
    Points : 29
    Points
    29
    Par défaut SUM sur trois tables
    Bonjours

    J'ai trois tables:

    TABLEA: REF| quantiteA

    TABLEB: ID_B|REF|quantiteB

    TABLEC: ID_C| REF| quantiteC


    En une seule requête, j'aimerais ressortir le total de quantité pour chaque REF


    NB: Il y a une seule ligne de TABLE A et zéro ou plusieurs lignes de TABLE B et TABLE C


    Voici ce que j'ai essayé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT Ref, SUM(quantiteA + IFNULL(quantiteB, 0) + IFNULL(quantiteC, 0)) AS Total
     
    FROM            TABLEA LEFT OUTER JOIN
     
                    TABLEB ON TABLEA.Ref = TABLEB.Ref LEFT OUTER JOIN
     
                    TABLEC ON TABLEA.Ref = TABLEC.Ref
     
    GROUP BY Ref
    Mais la quantité que me génère cette requête est fausse.

    Merci pour vos réponses

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 778
    Points
    30 778
    Par défaut
    Exécute ta requête sans GROUP BY ni SUM et tu comprendras l'origine de ton erreur.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mars 2008
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 69
    Points : 29
    Points
    29
    Par défaut
    A votre avis l'erreur provient de quel niveau de la requête car j'ai essayé par tous les moyens

    Merci

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 778
    Points
    30 778
    Par défaut
    En regardant le résultat de ta requête sans regroupement, tu as certainement constaté que tu avais un problème de produit cartésien entre tableb et tablec.

    Un exemple très simple :
    tablea  tableb  tablec
    ref qte ref qte ref qte
    A   1   A   2   A   3
            A   4   A   5
    Si tu affiches le détail de la requête que tu essayes d'exécuter, tu obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT  tba.ref
        ,   tba.qte qta
        ,   tbb.qte qtb
        ,   tbc.qte qtc
    FROM    tablea  tba
        LEFT OUTER JOIN
            tableb  tbb
            ON  tba.ref = tbb.ref
        LEFT OUTER JOIN
            tablec  tbc
            ON  tba.ref = tbc.ref
    ;
    ref qta qtb qtc
    A   1   2   3
    A   1   2   5
    A   1   4   3
    A   1   4   5
    Si tu fais la somme de tout ça, tu obtiens :
    ref qta qtb qtc
    A   4  12  16
    Ce qui n'est pas tout à fait ce à quoi tu t'attendais

    Il faut donc passer par des regroupements intermédiaires :
    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
    SELECT  tablea.ref
        ,   quantitea + COALESCE(groupb.totalb, 0) + COALESCE(groupc.totalc, 0) AS Total
    FROM    tablea
        LEFT OUTER JOIN
            (   SELECT  tableb.ref
                    ,   SUM(tableb.quantiteb) totalb
                FROM    tableb
                GROUP BY tableb.ref
            )  groupb
        LEFT OUTER JOIN
            (   SELECT  tablec.ref
                    ,   SUM(tablec.quantiteb) totalc
                FROM    tablec
                GROUP BY tablec.ref
            )  groupc
            ON tablea.ref = groupc.ref
    -- GROUP BY tablea.ref /* Edit : à supprimer */
    ;
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Mars 2008
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 69
    Points : 29
    Points
    29
    Par défaut
    Bonjours al1_24,

    Vous etes genial !!!!!!!!!!!!!!!!!
    ca marche a merveille en ajoutant
    GROUP BY tablea.Ref, quantitea, groupb.totalb, groupc.totalc

    Merci boku

    a+

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 778
    Points
    30 778
    Par défaut
    Quelle horreur !
    J'ai oublié d'enlever la clause GROUP BY sur tablea.

    Elle n'a plus aucune utilité
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

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

Discussions similaires

  1. [SQL Server 8] Discussion : Full Jointure sur trois tables
    Par Baquardie dans le forum Langage SQL
    Réponses: 5
    Dernier message: 22/12/2006, 15h01
  2. Requete delete sur trois table
    Par ganga dans le forum Langage SQL
    Réponses: 1
    Dernier message: 09/10/2006, 18h49
  3. [PostgreSQL] (Requête sur trois tables)
    Par nils56 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 19/05/2006, 14h50
  4. [VB6] Requete sur Trois Tables
    Par ayouss dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 15/05/2006, 16h09
  5. jointure sur TROIS tables
    Par caribou_belle dans le forum Langage SQL
    Réponses: 8
    Dernier message: 01/03/2004, 12h20

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