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 et SQL. Discussion :

JOIN et GROUP BY avec plusieurs regroupements


Sujet :

Requêtes et SQL.

  1. #1
    Membre habitué Avatar de ecarbill
    Homme Profil pro
    Cyberdocumentaliste
    Inscrit en
    Juin 2004
    Messages
    229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Cyberdocumentaliste
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2004
    Messages : 229
    Points : 147
    Points
    147
    Par défaut JOIN et GROUP BY avec plusieurs regroupements
    Bonjour. J'ai 5 tables dont j'ai présenté les relations en pièce jointe.

    --la table tblnomenclature_chapitres (c)
    --la table tblbudget (b)
    --la table tblengagements (e)
    --la table tblmodifications (m)
    --la table tblnomenclature_articles (a)

    La dernière table peut avoir plusieurs reférences dans les 2 tables avant (tblengagements et tblmodifications). Ces deux tables possèdent des champs numériques (eng_montant, modif_montant) dont je veux les sommes.

    Je veux obtenir un résultat sous forme
    a.article_code a.article_libelle b.budget_montant MODIFICATIONS ENGAGEMENTS

    La requête que j'ai écrite se présente comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT 
    a.article_ID,
    a.article_code, 
    a.article_libelle, 
    b.budget_montant, 
    Sum(m.modif_montant) AS MODIFICATIONS,
    SUM(e.eng_montant) AS ENGAGEMENTS 
    FROM (((tblnomenclature_articles a LEFT JOIN tblmodifications m ON a.article_ID = m.modif_article) LEFT JOIN tblbudget b ON a.article_ID = b.budget_article) LEFT JOIN tblengagements e ON e.eng_article=a.article_ID) LEFT JOIN tblnomenclature_chapitres c ON c.chapitre_code=a.chapitre_code  
    WHERE a.chapitre_code = '636' GROUP BY a.article_code, a.article_libelle,a.article_ID,b.budget_montant

    La première somme (MODIFICATIONS) est calculée correctement, mais mon problème est que pour la deuxième somme (ENGAGEMENTS) le résultat sortit est celui attendu multiplié par le nombre de ligne de la table tblengagements (e)

    Donc je ne voit pas très bien comment faire pour éviter ce calcul multiple. Donner moi un coup de main SVP
    Images attachées Images attachées  

  2. #2
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 777
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 777
    Points : 58 179
    Points
    58 179
    Billets dans le blog
    42
    Par défaut
    Bonjour,

    c’est normal, si pour l’article n°1 tu as 3 engagements et 2 modifications, la requête sans le GROUP BY va renvoyer 3x2 =6 lignes du style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ArticleId	EngagementId		ModifId
    1		1			1
    1		1			2
    1		2			1
    1		2			2
    1		3			1
    1		3			2
    En groupant par article, tu vois alors par exemple que chaque engagement est compté deux fois.

    Il faut donc passer pas des sous-requêtes, une pour sommer les montants des engagements par article, une pour sommer les montants des modifs par article, et une qui réunit l’ensemble des montants et des autres champs.

  3. #3
    Membre habitué Avatar de ecarbill
    Homme Profil pro
    Cyberdocumentaliste
    Inscrit en
    Juin 2004
    Messages
    229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Cyberdocumentaliste
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2004
    Messages : 229
    Points : 147
    Points
    147
    Par défaut
    Ok,j'essaye ca et je vous tiens au courant

  4. #4
    Membre habitué Avatar de ecarbill
    Homme Profil pro
    Cyberdocumentaliste
    Inscrit en
    Juin 2004
    Messages
    229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Cyberdocumentaliste
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2004
    Messages : 229
    Points : 147
    Points
    147
    Par défaut
    J'ai essayé ca

    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 
    a.article_ID,
    a.article_code, 
    a.article_libelle, 
    b.budget_montant, 
    MODIFICATIONS,
    SUM(e.eng_montant) AS ENGAGEMENTS 
    FROM (((tblnomenclature_articles a 
                    LEFT JOIN tblnomenclature_chapitres c ON c.chapitre_code=a.chapitre_code) 
                    LEFT JOIN tblbudget b ON a.article_ID = b.budget_article) 
                    LEFT JOIN tblengagements e ON e.eng_article=a.article_ID) 
                    LEFT JOIN (
                               SELECT modif_article,
                               Sum(modif_montant) AS MODIFICATIONS
                               FROM tblnomenclature_articles 
                               LEFT JOIN tblmodifications  ON article_ID = modif_article
                               GROUP BY modif_article)  m 
                    ON a.article_ID = m.modif_article         
    WHERE a.chapitre_code = '636' GROUP BY a.article_code, a.article_libelle,a.article_ID,b.budget_montant
    Mais je reçois le message d'erreur "Expression JOIN non supportée"

  5. #5
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 777
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 777
    Points : 58 179
    Points
    58 179
    Billets dans le blog
    42
    Par défaut
    Je verrais plutôt ceci:

    Code sql : 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
    SELECT a.article_id,
           a.article_code,
           a.article_libelle,
           Nz(b.budget_montant, 0)    AS budget,
           Nz(m.somme_modif, 0)       AS modifications,
           Nz(e.somme_engagements, 0) AS engagements
    FROM   ( (tblnomenclature_articles a
              LEFT JOIN tblbudget b
                ON a.article_id = b.budget_article)
             LEFT JOIN (SELECT modif_article,
                               SUM(modif_montant) AS somme_modif
                        FROM   tblmodifications
                        GROUP  BY modif_article) m
               ON a.article_id = m.modif_article )
           LEFT JOIN (SELECT eng_article,
                             SUM(eng_montant) AS somme_engagements
                      FROM   tblengagements
                      GROUP  BY eng_article) e
             ON a.article_id = e.eng_article
    WHERE  a.chapitre_code = '636';

    L'aide des assistants devrait t'aider à comprendre ce que fait la requête.
    J'ai introduit la fonction Nz car il peut y avoir des articles sans modification ou sans engagement (ou sans budget !?).

    à+

  6. #6
    Membre habitué Avatar de ecarbill
    Homme Profil pro
    Cyberdocumentaliste
    Inscrit en
    Juin 2004
    Messages
    229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Cyberdocumentaliste
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2004
    Messages : 229
    Points : 147
    Points
    147
    Par défaut
    Merci beaucoup f-leb. Ça marche parfaitement.

    Bon week end à toi

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

Discussions similaires

  1. Etat détaillé avec plusieurs regroupements
    Par danouna dans le forum IHM
    Réponses: 2
    Dernier message: 13/04/2008, 21h15
  2. JOIN avec plusieurs Items dirigeant vers le même item ?
    Par Fred_76 dans le forum Requêtes
    Réponses: 4
    Dernier message: 05/07/2006, 12h08
  3. une requête avec plusieurs INNER JOIN, cmt faire ?
    Par elhosni dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 10/01/2006, 17h55
  4. Quel resultat avec un group by pour plusieurs valeurs?
    Par sampq dans le forum Langage SQL
    Réponses: 3
    Dernier message: 23/12/2005, 12h08
  5. requete avec left join et group by
    Par slc dans le forum Requêtes
    Réponses: 2
    Dernier message: 14/09/2004, 18h03

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