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 :

Problème SUM et jointure


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2014
    Messages : 3
    Par défaut Problème SUM et jointure
    Bonjour
    J'ai problème d'une requête sql concernant SUM et jointure; j'essaierai d'être clair
    j'ai quatre tables (article , commande, dec et bon)
    je veux connaitre ma situation concernant tous les articles
    la requête s'exécute bien mais les calculs sont faux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT article.idarticle, nomarticle, SUM(IFNULL((commande.quantite),0)) as somme1 ,SUM(IFNULL((decharge.quantite),0)) as somme2, SUM(IFNULL((bonst.quantite),0)) as somme3 
    FROM article 
    	LEFT JOIN commande ON article.idarticle = commande.idarticle
    	LEFT JOIN decharge ON commande.idarticle = decharge.idarticle
    	LEFT JOIN bonst ON decharge.idarticle = bonst.idarticle
    	GROUP BY article.idarticle ,commande.idarticle, decharge.idarticle,bonst.idarticle
    	ORDER BY nomarticle
    je commence à m'arracher les cheveux ( ceux qui me restent )
    Merci d'avance les amis

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 136
    Par défaut
    Citation Envoyé par charaflemeilleur Voir le message
    la requête s'exécute bien mais les calculs sont faux
    Faux comment ?
    Pour pouvoir t'aider un peu plus, il faudrait nous fournir un petit jeu d'essai avec le résultat obtenu et le résultat attendu.
    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
    Membre chevronné Avatar de Sebwar
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2012
    Messages
    172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2012
    Messages : 172
    Par défaut
    Hello,

    J'aurai plutôt vu ça comme requête :
    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	
    	article.idarticle,
    	nomarticle,
    	COALESCE(SUM(commande.quantite),0),
    	COALESCE(SUM(decharge.quantite),0),
    	COALESCE(SUM(bonst.quantite),0)
    FROM
    	article 
    	LEFT JOIN commande ON article.idarticle = commande.idarticle
    	LEFT JOIN decharge ON article.idarticle = decharge.idarticle
    	LEFT JOIN bonst ON article.idarticle = bonst.idarticle
    GROUP BY
    	article.idarticle,
    	nomarticle
    ORDER BY
    	nomarticle
    mais on manque d'infos

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 136
    Par défaut
    Je pense plus à de multiples jointures avec des relations 1-n qui se résolvent en produits cartésiens.
    Il faudrait passer les regroupements en tables dérivées pour éviter cela.
    Mais, sans informations complémentaires de la part de @charaflemeilleur, ce ne sont que des suppositions...
    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
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2014
    Messages : 3
    Par défaut
    Merci pour vos réponses
    @Sebwar les calculs sont toujours faux
    je vous donne plus d'explications:
    * table commande
    idcde idarticle type quantite prixttc reference

    * table décharge
    iddecharge idarticle reference quantite

    *table bonst
    idbonst idarticle designation quantite

    exemple de ce que je veux avoir comme résultat:

    idarticle nomarticle sommeDesCommandes sommeDesDecharges sommesDesBons
    1 articleA 121 10 4
    2 articleB 160 10 25
    3 articleC 31 5 0
    4 articleD 20 0 3

    et voila les résultats que j'obtiens

    idarticle nomarticle sommeDesCommandes sommeDesDecharges sommesDesBons
    1 articleA 242 20 4
    2 articleB 160 20 50
    3 articleC 31 5 0
    4 articleD 20 0 3

    d'où vient l'erreur??

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 136
    Par défaut
    Citation Envoyé par charaflemeilleur Voir le message
    d'où vient l'erreur??
    Citation Envoyé par al1_24 Voir le message
    ...de multiples jointures avec des relations 1-n qui se résolvent en produits cartésiens.
    Je confirme !
    Citation Envoyé par al1_24 Voir le message
    Il faudrait passer les regroupements en tables dérivées pour éviter cela.
    Comme cela :
    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
    SELECT  art.idarticle
        ,   art.nomarticle
        ,   COALESCE(cmd.quantite, 0)   AS somme1
        ,   COALESCE(dch.quantite, 0)   AS somme2
        ,   COALESCE(bns.quantite, 0)   AS somme3
    FROM    article art
    	LEFT JOIN
            (   SELECT  idarticle
                    ,   SUM(quantite)   AS  quantite
                FROM    commande
                GROUP BY idarticle
            )   cmd
            ON  art.idarticle = cmd.idarticle
    	LEFT JOIN
            (   SELECT  idarticle
                    ,   SUM(quantite)   AS  quantite
                FROM    decharge
                GROUP BY idarticle
            )   dch
            ON  art.idarticle = dch.idarticle
    	LEFT JOIN
            (   SELECT  idarticle
                    ,   SUM(quantite)   AS  quantite
                FROM    bonst
                GROUP BY idarticle
            )   bns
            ON  art.idarticle = bns.idarticle
    ORDER BY art.nomarticle
    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.

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 636
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par charaflemeilleur Voir le message
    d'où vient l'erreur??
    Citation Envoyé par al1_24 Voir le message
    Je pense plus à de multiples jointures avec des relations 1-n qui se résolvent en produits cartésiens
    Il faudrait passer les regroupements en tables dérivées pour éviter cela
    .

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 636
    Billets dans le blog
    10
    Par défaut
    voici un exemple (je me suis limité aux articles, commandes et bons, il faut ajouter décharge, le principe reste le même)

    Création du jeu d'essai avec des CTE
    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
    with CTEART(IDART, LBART) as         
        (select 001, 'Pendule   '   
         union all                       
         select 002, 'Chaise    '   
         union all                       
         SELECT 003, 'Rateau    '   
        )                                
       , CTECDE(IDCDE, IDART, QTCDE) as  
        (select 001, 001, 010      
         union all                       
         select 001, 003, 015      
         union all                       
         select 002, 001, 008      
         union all                       
         select 003, 002, 100      
         union all                       
         select 004, 001, 020      
         union all                       
         select 004, 002, 020      
        )                                
       , CTEBON(IDBON, IDART, QTBON) as 
        (select 001, 002, 033  
         union all                      
         select 002, 002, 066  
         union all                      
         select 003, 003, 080  
         union all                      
         select 004, 003, 080  
        )
    La requête suivante utilise des tables dérivées, les cumuls sont corrects
    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
    select AR.idart                             
         , AR.lbart                             
         , S1.QCOM as Qte_Cdee                  
         , S2.QBON as Qte_Bonst                 
    from CTEART as AR                           
    left join                                   
        (select IDART                           
              , sum(QTCDE) as QCOM             
         from CTECDE                            
         group by IDART) as S1                  
      on S1.IDART=AR.IDART                      
    left join                                   
        (select IDART                           
              , sum(QTBON) as QBON             
         from CTEBON                            
         group by IDART) as S2                  
      on S2.IDART=AR.IDART
    Résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Idart Lbart         Qte_cdee   Qte_bonst 
        1 Pendule             38 ----------- 
        2 Chaise             120          99 
        3 Rateau              15         160

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

Discussions similaires

  1. Problème de SUM dans jointure BaseSQL
    Par morpheuss dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/12/2016, 15h02
  2. Réponses: 2
    Dernier message: 21/07/2005, 12h05
  3. Problème affichage suite jointure
    Par xavier1977 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 12/07/2005, 15h00
  4. Débutant SQL, problème sur une jointure censée exclure ??
    Par derfatypik dans le forum Langage SQL
    Réponses: 8
    Dernier message: 22/06/2005, 15h55
  5. Réponses: 6
    Dernier message: 20/09/2004, 15h26

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