Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > Requêtes et SQL.
Requêtes et SQL. Tout ce qui concerne vos questions sur les requêtes et le SQL sous Access se trouve ici.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/01/2012, 16h55   #1
Membre du Club
 
Homme KONE
Inscription : juin 2004
Messages : 109
Détails du profil
Informations personnelles :
Nom : Homme KONE
Localisation : Côte d'Ivoire

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : juin 2004
Messages : 109
Points : 43
Points : 43
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 :
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
Type de fichier : png Relations.PNG (32,2 Ko, 3 affichages)
__________________
Une somme de savoirs en chaque matière, si minime soit-elle, rend n'importe quel benêt, dans un pays de benêts, docte.
ecarbill est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2012, 18h34   #2
Expert Confirmé Sénior
 
Avatar de f-leb
 
Homme Fabien
Enseignant
Inscription : janvier 2009
Messages : 2 415
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 41
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : janvier 2009
Messages : 2 415
Points : 4 447
Points : 4 447
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 :
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.
f-leb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2012, 06h57   #3
Membre du Club
 
Homme KONE
Inscription : juin 2004
Messages : 109
Détails du profil
Informations personnelles :
Nom : Homme KONE
Localisation : Côte d'Ivoire

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : juin 2004
Messages : 109
Points : 43
Points : 43
Ok,j'essaye ca et je vous tiens au courant
__________________
Une somme de savoirs en chaque matière, si minime soit-elle, rend n'importe quel benêt, dans un pays de benêts, docte.
ecarbill est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2012, 07h49   #4
Membre du Club
 
Homme KONE
Inscription : juin 2004
Messages : 109
Détails du profil
Informations personnelles :
Nom : Homme KONE
Localisation : Côte d'Ivoire

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : juin 2004
Messages : 109
Points : 43
Points : 43
J'ai essayé ca

Code :
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"
__________________
Une somme de savoirs en chaque matière, si minime soit-elle, rend n'importe quel benêt, dans un pays de benêts, docte.
ecarbill est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2012, 11h02   #5
Expert Confirmé Sénior
 
Avatar de f-leb
 
Homme Fabien
Enseignant
Inscription : janvier 2009
Messages : 2 415
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 41
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : janvier 2009
Messages : 2 415
Points : 4 447
Points : 4 447
Je verrais plutôt ceci:

Code sql :
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 !?).

à+
f-leb est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/01/2012, 12h46   #6
Membre du Club
 
Homme KONE
Inscription : juin 2004
Messages : 109
Détails du profil
Informations personnelles :
Nom : Homme KONE
Localisation : Côte d'Ivoire

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : juin 2004
Messages : 109
Points : 43
Points : 43
Merci beaucoup f-leb. Ça marche parfaitement.

Bon week end à toi
__________________
Une somme de savoirs en chaque matière, si minime soit-elle, rend n'importe quel benêt, dans un pays de benêts, docte.
ecarbill est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h01.


 
 
 
 
Partenaires

Hébergement Web