Vous êtes sur la page 1sur 38

Les requtes avec regroupement

Oprations Compte et Somme


Par f-leb
Date de publication : 12 dcembre 2012
Dernire mise jour : 8 janvier 2013

Cet article se propose de faire dcouvrir les requtes avec regroupement sous Access pour
effectuer des oprations lmentaires et frquentes de comptage et d'addition. L'approche
se veut didactique et progressive. On commence par dcouvrir le principe en utilisant
exclusivement l'interface graphique avant d'aborder des cas plus complexes et le langage
de requte SQL sous-jacent.

Les requtes avec regroupement par f-leb

I - Introduction..............................................................................................................................................................3
II - Prrequis................................................................................................................................................................ 4
III - Principe..................................................................................................................................................................4
IV - Les oprations d'agrgation................................................................................................................................. 7
IV-A - Opration Compte....................................................................................................................................... 8
IV-A-1 - Compte([NomDuChamp]).................................................................................................................... 8
IV-A-2 - Compte(*).......................................................................................................................................... 10
IV-A-3 - Compte([idCommande]) ou Compte(*) ?.......................................................................................... 11
IV-B - Opration Somme......................................................................................................................................13
IV-B-1 - Principe..............................................................................................................................................13
IV-B-2 - ...mais Access ne sait pas faire des additions !................................................................................14
V - Les filtres............................................................................................................................................................. 16
V-A - Opration O ........................................................................................................................................16
V-B - Filtre sur opration d'agrgation.................................................................................................................19
V-C - En rsum.................................................................................................................................................. 19
VI - Regroupement sur plusieurs champs.................................................................................................................19
VI-A - Exemple avec deux champs..................................................................................................................... 19
VI-B - Notion de dpendance fonctionnelle......................................................................................................... 21
VI-C - Optimisation............................................................................................................................................... 24
VI-C-1 - Utilisation de l'oprateur d'agrgation Premier ...........................................................................24
VI-C-2 - Utilisation d'une sous-requte...........................................................................................................25
VII - Vous avez essay d'excuter une requte....................................................................................................... 26
VIII - Et le code SQL ?.............................................................................................................................................. 29
IX - Best of de requtes avec regroupement..................................................................................................... 30
IX-A - Comptage sur une sous-requte qui isole des enregistrements distincts................................................. 30
IX-B - Reprer des doublons............................................................................................................................... 32
IX-C - Somme ou Compte................................................................................................................................... 33
IX-D - Calculer un rang par catgorie................................................................................................................. 35
X - Rfrences pour aller plus loin........................................................................................................................... 38
XI - Conclusion.......................................................................................................................................................... 38
XII - Remerciements.................................................................................................................................................. 38

-2Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 f-leb. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://f-leb.developpez.com/tutoriels/Access/Requete_avec_regroupement/

Les requtes avec regroupement par f-leb

I - Introduction
quelles occasions a-t-on besoin d'oprer des regroupements dans une requte Access ?

(Opration de regroupement accessible lors du clic sur le bouton


en langage SQL grce la clause de regroupement GROUP BY).

dans l'interface QBE

(1)

, ou directement

Typiquement, lorsque vous souhaitez le total des commandes par client, vous devez dans un premier temps oprer
des regroupements de l'ensemble de chacune de ses commandes.

Dans un deuxime temps et pour chaque regroupement de client obtenu, vous additionnez les montants de ses
commandes.

En d'autres termes, il s'agit de partitionner un ensemble d'enregistrements en plusieurs groupes disjoints afin
d'effectuer une opration de synthse sur chacun des groupes (un comptage, une somme, une moyenne, etc.).

(1) QBE : sigle pour Query By Example , l'interface graphique pour travailler les requtes et gnrer le code SQL
correspondant.
-3Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 f-leb. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://f-leb.developpez.com/tutoriels/Access/Requete_avec_regroupement/

Les requtes avec regroupement par f-leb

Une table est comparable un sac o seraient mlangs les torchons et les serviettes. Si
on veut compter les nombres de torchons et de serviettes, il faut regrouper et faire deux tas.

II - Prrequis
Finalement, ils sont peu nombreux. On vous pargne mme les rudiments du fameux langage d'interrogation SQL

(2)

Tout juste on vous propose d'avoir afft vos premires armes grce au tutoriel de jeannot45 : Crer des requtes
simples.

III - Principe
On part d'une table TblCommande (inspire du cas d'cole de la base Les Comptoirs ) dont nous donnons un
aperu partiel :

Commenons par analyser une requte de slection toute simple et le rsultat tri retourn :
(2) SQL : sigle pour Structured Query Language , langage normalis de cration et de manipulation des donnes
de la plupart des Systmes de Gestion de Bases de Donnes Relationnelles (SGBDR).
-4Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 f-leb. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://f-leb.developpez.com/tutoriels/Access/Requete_avec_regroupement/

Les requtes avec regroupement par f-leb

Ici, nous demandons pour chacun des 830 enregistrements (et donc pour les 830 commandes passes) de la table,
d'afficher le champ [CodeClient]

(3)

En particulier, les quatre lignes avec le [CodeClient]= ALFKI montrent que celui-ci a pass quatre commandes,
le [CodeClient]= ANATR quatre commandes, [CodeClient]= ANTON sept commandes, etc.

Retournons dans le QBE et cliquons sur le bouton (malheureusement nomm) Totaux qui prend l'aspect :
Dans la fentre d'dition, la ligne supplmentaire Opration apparat avec le libell Regroupement sous le
champ [CodeClient] de la table [TblCommande] :

(3) L'usage dans l'univers des SGBDR et le langage SQL va dans le sens de l'utilisation des termes Colonne et
Ligne en remplacement de Champ et Enregistrement ( les champs sont la campagne ou dans les formulaires
comme aime le rappeler CinePhil). Les termes Ligne et Colonne sont d'ailleurs appropris la reprsentation
tabulaire des tables en mode feuille de donnes mais Microsoft en a dcid autrement pour Access. En
consquence, nous continuerons d'utiliser Champ puis Enregistrement dans cet article, conformment aux
usages dans l'univers Access.
-5Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 f-leb. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://f-leb.developpez.com/tutoriels/Access/Requete_avec_regroupement/

Les requtes avec regroupement par f-leb

Le fil d'excution de la requte est le suivant :

parmi les enregistrements de [TblCommande], regrouper en sous-divisions par [CodeClient] (Opration :


Regroupement. Champ: CodeClient) ;
pour chaque sous-division obtenue, faire une synthse en affichant le contenu du champ [CodeClient] (case
Afficher coche).

Bien entendu, la requte prcdente prsente peu d'intrt en pratique (elle fait son travail en se contentant de
ramener les [CodeClient] sans doublon), mais elle peut le devenir si nous rajoutons une ou plusieurs oprations
statistiques sur les regroupements d'enregistrements.
Imaginons que nous souhaitions compter le nombre de commandes, ceci par client.
Rcapitulons nouveau le fil d'excution :

-6Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 f-leb. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://f-leb.developpez.com/tutoriels/Access/Requete_avec_regroupement/

Les requtes avec regroupement par f-leb

parmi les enregistrements de [TblCommande], regrouper en sous-divisions les enregistrements ayant le


mme [CodeClient] ;
pour chaque sous-division, compter le nombre de commandes ;
puis pour chaque sous-division, faire une synthse en retournant un enregistrement qui comportera les
champs [CodeClient], [CompteDeIdCommande] (le comptage des commandes de la sous-division).

Dans le QBE d'Access, nous traduisons cela avec l'opration Compte :

Voil pour le principe.

IV - Les oprations d'agrgation


Agrgation n. f. Assemblage de parties homognes formant un tout.
Une opration d'agrgation consiste faire une synthse d'une srie de valeurs.
Le langage SQL d'Access propose les neuf oprations d'agrgation suivantes :
Dans le QBE d'Access
(version franaise)

Mot-cl SQL
Count
Sum

Avg

Dfinition
Calcule le nombre
d'enregistrements renvoys
par une requte.
Renvoie la somme d'une
srie de valeurs contenues
dans un champ de table/
requte.
Calcule la moyenne
arithmtique d'une srie de

-7Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 f-leb. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://f-leb.developpez.com/tutoriels/Access/Requete_avec_regroupement/

Les requtes avec regroupement par f-leb

Min

Max

First

Last

StDev

Var

valeurs contenues dans un


champ de table/requte.
Renvoie la valeur minimale
d'une srie de valeurs
contenues dans un champ
de table/requte.
Renvoie la valeur maximale
d'une srie de valeurs
contenues dans un champ
de table/requte.
Renvoie la valeur d'un
champ du premier
enregistrement parmi les
enregistrements retourns
par la requte.
Renvoie la valeur d'un
champ du dernier
enregistrement parmi les
enregistrements retourns
par la requte.
Renvoie l'estimation d'carttype pour un chantillon
de population reprsent
par une srie de valeurs
contenues dans un champ
de table/requte.
Renvoie l'estimation de
variance pour un chantillon
de population reprsent
par une srie de valeurs
contenues dans un champ
de table/requte.

Dans cet article, nous nous limiterons aux deux premires oprations. L'opration Premier sera voque dans un
cas trs particulier avec les prcautions qui s'imposent.

IV-A - Opration Compte


IV-A-1 - Compte([NomDuChamp])
Nous avons dj eu un aperu de cette opration au chapitre prcdent lors du comptage des commandes par client.

-8Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 f-leb. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://f-leb.developpez.com/tutoriels/Access/Requete_avec_regroupement/

Les requtes avec regroupement par f-leb

La ligne Champ au-dessus de l'opration Compte, peut comporter un champ de table ou une expression calcule
renvoyant une valeur de type numrique, texte ou date.
L'important est que dans ce cas, seuls les enregistrements o la valeur du champ est non
vide (non marqu Null), sont dnombrs.
Dans l'exemple ci-dessous, nous mettons le champ [DateEnvoi] comme paramtre de la fonction Compte:

-9Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 f-leb. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://f-leb.developpez.com/tutoriels/Access/Requete_avec_regroupement/

Les requtes avec regroupement par f-leb

et nous constatons sans surprise que seulement six des sept commandes du client WOLZA ont t dnombres
cause de la [DateEnvoi] marque Null lors de sa dernire commande.
Nous ne discuterons pas ici du bien-fond ou non de ce champ Nullable pour modliser
le fait, par exemple, qu'une commande n'ait pas t envoye. Il s'agit plutt ici de constater
les premiers effets de bord dus la prsence du marqueur Null sur l'valuation des
fonctions d'agrgation.
Nous n'avons pas fini d'en discuter.

IV-A-2 - Compte(*)
Pour dnombrer tous les enregistrements, nous pouvons utiliser le caractre gnrique astrisque * comme
argument de la fonction Compte. Pour cela, le QBE d'Access nous oblige basculer la ligne Opration
Expression avant de saisir au clavier l'expression avec Compte(*) sur la ligne Champ .

- 10 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 f-leb. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://f-leb.developpez.com/tutoriels/Access/Requete_avec_regroupement/

Les requtes avec regroupement par f-leb

NbrCommandes est l'alias

(4)

du champ retourn par la requte.

IV-A-3 - Compte([idCommande]) ou Compte(*) ?


Mais alors, on prend laquelle ?

Si vous utilisez un astrisque, la fonction Compte(*) calcule le nombre total des enregistrements par client mme si
ceux-ci ont tous leurs champs marqus Null. Si vous utilisez Compte([idCommande]), la fonction calcule le nombre
d'enregistrements par client avec [idCommande] non Null.
La cl primaire [idCommande] de TblCommande tant non Null par principe, les deux requtes retournent
rigoureusement le mme rsultat.
Seulement, la documentation Access prcise bien :
Count(*) s'xecute beaucoup plus rapidement que Count([nom_de_colonne]).
Donc privilgiez l'utilisation de Compte(*) lorsque cela vous est possible.
Pour distinguer l'usage de Compte(*) et Compte([NomDuChamp]), on propose l'exercice qui suit.
On souhaite le nombre de commandes par client, ceci pour tous les clients enregistrs dans la table TblClient,
y compris ceux qui, dfaut d'avoir pass une seule commande, ne manifestent aucune prsence dans la table
TblCommande.
On commence par une requte de slection sur les deux tables TblClient et TblCommande avec une jointure de
type 2 pour ramener tous les clients, y compris ceux qui ne figurent pas dans la table des commandes.

Le rsultat :
(4) Alias : un nom de substitution donn un champ d'une table/requte.
- 11 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 f-leb. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://f-leb.developpez.com/tutoriels/Access/Requete_avec_regroupement/

Les requtes avec regroupement par f-leb

Tiens ! Le client FISSA n'a pass aucune commande. Pour obtenir le nombre de commandes par client (et donc
zro commande pour le client FISSA ), doit-on utiliser Compte(*) ou Compte([idCommande]) ?

Rponse :
Un Compte(*) retournera un nombre de commandes gal un pour le client FISSA puisqu'il y a un enregistrement
retourn.
La bonne rponse est d'effectuer un Compte([idCommande]) qui ne dnombre que les enregistrements o
[idCommande] est non Null.

- 12 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 f-leb. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://f-leb.developpez.com/tutoriels/Access/Requete_avec_regroupement/

Les requtes avec regroupement par f-leb

IV-B - Opration Somme


IV-B-1 - Principe
On regarde maintenant du ct des lignes de commande :

Pour la partie facturation, nous avons besoin de regrouper les lignes de commande par [idCommande] et de faire
la somme :
Somme([PrixUnitaire]*[QtteCommande])
Le principe de ralisation d'une telle requte n'appelle pas de commentaire particulier :

opration de regroupement par [idCommande] ;


opration d'agrgation Somme sur l'expression [PrixUnitaire]*[QtteCommande];
la synthse qui, par commande, retourne un enregistrement ([idCommande], [PrixCommande]).

- 13 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 f-leb. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://f-leb.developpez.com/tutoriels/Access/Requete_avec_regroupement/

Les requtes avec regroupement par f-leb

Et on retrouve bien, par exemple pour [idCommande]=10248, la somme des lignes :


2 200 = (70 x 12) + (49 x 10) + (174 x 5)

IV-B-2 - ...mais Access ne sait pas faire des additions !


On rajoute un champ [Remise] dans le dtail des commandes :

Le grain de sable a t introduit dans la commande identifie 10248 avec un champ [Remise] ngligemment marqu
Null (encadr en rouge) :

Voici ce que retourne une simple requte de slection avec les champs calculs [AvantRemise], [MontantRemise]
et [ApresRemise] :

- 14 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 f-leb. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://f-leb.developpez.com/tutoriels/Access/Requete_avec_regroupement/

Les requtes avec regroupement par f-leb

Faisons le bilan :

Le total avant remise est de 2 200 , le montant de la remise est de 87 .


Le montant de la commande devrait tre de 2 200 - 87 = 2 113 , du moins si vous le calculiez comme cela
en faisant la diffrence entre le montant avant la remise et la remise. En fait, tout se passe comme si le champ
Null tait zro.
Parce que si vous faites autrement en faisant la somme des montants de la colonne [ApresRemise]

la facture passe 1 273 , ampute de la totalit de la ligne de commande cause de cette remise non renseigne.
Votre comptable sera ravi d'apprendre que :
Somme([QtteCommande] x [PrixUnitaire]) - Somme([Remise] x [QtteCommande] x [PrixUnitaire])
ne donne pas toujours le mme rsultat que :
Somme([QtteCommande] x [PrixUnitaire] x (1 - [Remise]))

Access ne sait pas faire des additions


Vous pouvez toujours rtorquer que le dveloppeur averti aurait naturellement surcharg sa programmation coup
de :
- 15 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 f-leb. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://f-leb.developpez.com/tutoriels/Access/Requete_avec_regroupement/

Les requtes avec regroupement par f-leb

Nz([remise];0)

qui remplace les marqueurs Null par la valeur numrique 0.


(Imaginez toutefois la moyenne sur le bulletin du gamin si en suivant le mme conseil, le logiciel remplaait les notes
non renseignes d'un devoir par zro !)
Si le cahier des charges de l'application prcise que la remise doit tre systmatiquement renseigne, la solution
idale est d'interdire tout simplement la prsence de l'affreux Null dans la table :

Quoi qu'il en soit, on vous a maintenant assez prvenu des effets parfois nfastes du marqueur Null.

V - Les filtres
V-A - Opration O
On revient sur une requte prcdente :

- 16 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 f-leb. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://f-leb.developpez.com/tutoriels/Access/Requete_avec_regroupement/

Les requtes avec regroupement par f-leb

L'opration O dans une requte avec regroupement effectue une restriction sur les enregistrements avant que
le regroupement ne soit effectif.
Ici, le regroupement est donc opr uniquement sur les enregistrements vrifiant le critre :
Anne([DateCommande])=Anne(Date())

Trois commandes en 2012 pour le client [ALFKI], une seule en 2012 pour [ANATR], etc.
Essayons maintenant les deux requtes suivantes visant compter, parmi les commandes passes lors de l'anne
en cours, le nombre de commandes pour les [CodeClient] commenant par la lettre A .

- 17 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 f-leb. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://f-leb.developpez.com/tutoriels/Access/Requete_avec_regroupement/

Les requtes avec regroupement par f-leb

Dans la premire version, la requte effectue une restriction supplmentaire sur le [CodeClient]. Les enregistrements
de la table des commandes dont l'anne de la [dateCommande] ne correspond pas l'anne en cours et dont le
[CodeClient] ne commence pas par A sont exclus avant d'oprer le regroupement et de retourner la synthse :

Dans la deuxime version, on effectue comme prcdemment une restriction sur la [dateCommande]. La diffrence
est qu'ici on opre d'abord le regroupement et le comptage. Puis seulement aprs, on retire les synthses dont le
[CodeClient] ne commence pas par A :

Il est vident que dans ces versions, les deux requtes retournent un rsultat identique. Toutefois la deuxime version
est dconseille puisqu'elle oblige d'abord oprer le comptage sur 83 sous-divisions avant finalement de n'en retenir
que quatre.

- 18 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 f-leb. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://f-leb.developpez.com/tutoriels/Access/Requete_avec_regroupement/

Les requtes avec regroupement par f-leb

V-B - Filtre sur opration d'agrgation


Par contre, si on souhaite faire une restriction sur le nombre de commandes passes, on doit filtrer sur le rsultat
retourn par la fonction d'agrgation Compte.
Ainsi, si nous voulons une requte qui, pour les commandes passes lors de l'anne en cours, ne retienne que les
clients ayant command plus de cinq fois, on doit :

retirer les enregistrements de TblCommande dont l'anne de la [dateCommande] ne correspond pas


l'anne en cours (opration O ) ;
oprer un regroupement sur le [codeClient] (opration Regroupement) ;
compter tous les enregistrements pour chaque sous-division opre (opration Compte) ;
exclure les synthses o le comptage donne un rsultat infrieur ou gal 5 (critre >5 ) ;
afficher la synthse retourne (cases Afficher coches).

Ce qui donne dans le QBE :

V-C - En rsum
L'opration O permet de filtrer les enregistrements avant que le regroupement ne soit effectif.
Un critre sur une opration d'agrgation n'agit qu'aprs regroupement et synthse. On l'utilise pour liminer les
synthses ne vrifiant pas le critre sur l'expression agrge (critre sur un comptage, une somme, etc.).

VI - Regroupement sur plusieurs champs


VI-A - Exemple avec deux champs
des fins comptables ou statistiques, nous pouvons tre amens dterminer les nombres de commandes passes
par nos clients, et ceci par anne civile.
Le partitionnement des enregistrements de la table des commandes doit se faire de la faon suivante, par client et
par anne de la date de commande :

- 19 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 f-leb. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://f-leb.developpez.com/tutoriels/Access/Requete_avec_regroupement/

Les requtes avec regroupement par f-leb

Dans le QBE, la solution vient naturellement en regroupant dans la table des commandes par commande et par
anne (champ calcul : Anne([DateCommande]).

- 20 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 f-leb. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://f-leb.developpez.com/tutoriels/Access/Requete_avec_regroupement/

Les requtes avec regroupement par f-leb

Dans ce cas, le couple ( [CodeClient], Anne([DateCommande]) ) constitue ce qu'on


appelle souvent la cl de regroupement.

VI-B - Notion de dpendance fonctionnelle


Afin de complter la requte prcdente, nous voulons, en plus du [CodeClient], le nom du pays o sige la socit
[Pays].
Rechercher le champ [Pays] ncessite de faire participer galement la table des clients dans la requte :

Il se trouve que [Pays] est fonctionnellement dpendant de [CodeClient].


L'objet de cet article n'tant pas le Modle Relationnel de Donnes et la normalisation
des tables des SGBD relationnels, nous resterons trs simple au niveau du concept
de dpendance fonctionnelle (DF). Si le lecteur souhaite se familiariser plus en dtail,
il se tournera vers l'article correspondant : Bases de donnes relationnelles et
normalisation : de la premire la sixime forme normale, notamment au paragraphe
Dpendance fonctionnelle (DF).
Si nous reprenons la table des clients, un client a un [CodeClient] unique et chaque client
est en fait une socit avec un nom de socit [Societe].
Nous pouvons crire l'instruction :
- 21 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 f-leb. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://f-leb.developpez.com/tutoriels/Access/Requete_avec_regroupement/

Les requtes avec regroupement par f-leb

[CodeClient][Societe]
parce que pour un [CodeClient] donn, correspond exactement un nom de [Societe].
On dit alors que [Societe] est fonctionnellement dpendant de [CodeClient] ou que
[CodeClient] dtermine fonctionnellement [Societe].
[CodeClient] tant la cl primaire de la table, il dfinit fonctionnellement chaque attribut
de la table des clients :
[CodeClient][Societe]
[CodeClient][Contact]

[CodeClient][Adresse]

[CodeClient][Pays]
Note : D'ailleurs, si vous avez pris le coup, vous vous rendrez compte qu'il serait naturel
d'crire aussi la dpendance :
[Contact][Fonction]
(Si j'identifie un contact donn, j'ai bien dtermin sa fonction, non ?)
Ne faudrait-il pas une table TblContact ? Bravo, vous venez de dcouvrir une des raisons
pour laquelle la base de donnes Les comptoirs n'est vraiment pas un modle en
termes de normalisation. Passons
Voyons ce que donne le partitionnement de la table des commandes par [CodeClient] et par Anne([DateCommande])
si nous ajoutons simplement le champ [Pays] pour chaque enregistrement :

Nous constatons que grce la dpendance fonctionnelle [CodeClient][Pays], le partitionnement demeure


inchang si nous rajoutons [Pays] dans la cl de regroupement :

- 22 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 f-leb. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://f-leb.developpez.com/tutoriels/Access/Requete_avec_regroupement/

Les requtes avec regroupement par f-leb

Comme nous avons aussi les dpendances fonctionnelles :


[CodeClient][Societe]
[CodeClient][Contact]

[CodeClient][Adresse]
nous pouvons gnraliser dans le QBE et obtenir toutes les caractristiques du client dans notre requte de
comptage :

- 23 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 f-leb. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://f-leb.developpez.com/tutoriels/Access/Requete_avec_regroupement/

Les requtes avec regroupement par f-leb

Cette mthode n'est toutefois pas trs recommande en termes de performance comme nous allons le voir dans
le paragraphe suivant.

VI-C - Optimisation
On pourrait dire beaucoup de choses sur l'optimisation des requtes (cf. le Guide
d'optimisation de vos applications Microsoft Access). Les conseils de bon sens
comme celui de regrouper sur un nombre de champs minimal de type entier numrique
et indexs ( peu prs tout le contraire de la requte prcdente) s'avrent judicieux en
principe , surtout si les tables deviennent volumineuses.
Toutefois il y a de nombreux facteurs et un prototypage en rgle de vos requtes sensibles
dans l'environnement de production est le meilleur moyen de conclure de l'avantage d'une
requte sur telle autre.
On reprend la requte peu recommandable prcdente. On rappelle que cette requte est cense ramener le nombre
de commandes par client et par anne.
Ramener les informations du client dans la cl de regroupement pour obtenir le rsultat souhait est certes possible
grce aux dpendances fonctionnelles :
[CodeClient][Pays]
[CodeClient][Societe]
[CodeClient][Contact]
[CodeClient][DateCommande]
mais il reste qu'une cl de regroupement sur un nombre lev de champs est coteuse en termes de performance.
Deux mthodes permettent d'obtenir le mme rsultat de faon optimise (cf. http://support.microsoft.com/
kb/172199/en-us).

VI-C-1 - Utilisation de l'oprateur d'agrgation Premier


Aprs tout, le partitionnement sur les seuls [CodeClient] et Anne([DateCommande]) devraient suffire. Si on veut
ramener les autres attributs du client, il suffit pour chaque sous-division de prendre les informations sur une seule
des lignes de la sous-division. Pourquoi pas la premire en utilisant l'oprateur d'agrgation Premier ?

- 24 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 f-leb. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://f-leb.developpez.com/tutoriels/Access/Requete_avec_regroupement/

Les requtes avec regroupement par f-leb

Dans une table de base de donnes relationnelle, slectionner le premier


enregistrement n'a pas de sens. Les lignes de la table sont comparables aux billes d'un
sac de billes. Que signifie la premire bille ? Suivant quel critre ? D'ailleurs l'oprateur
d'agrgation Premier (mot-cl : First) est propre Access, vous ne le trouverez nulle part
dans la norme SQL.
Malgr l'aberration que cet oprateur reprsente et le caractre alatoire de ce qu'Access
retourne lorsqu'on lui demande de retourner le premier enregistrement, dans notre
contexte o toutes les billes regroupes sont identiques, il est tolrable de prendre la
premire trouve (parce qu'ici, on aurait aussi bien pu lui demander la dernire
- mot-cl : Last).

VI-C-2 - Utilisation d'une sous-requte


L'ide est encore d'optimiser la cl de regroupement. On regroupe sur un minimum de champs, de prfrence de type
numrique et indexs. Le [CodeClient] et l'anne de la date de commande Anne([DateCommande]) feront l'affaire ici.

La requte principale reprend la sous-requte :

- 25 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 f-leb. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://f-leb.developpez.com/tutoriels/Access/Requete_avec_regroupement/

Les requtes avec regroupement par f-leb

C'est par jointure de la table des clients et la sous-requte via le [CodeClient] que nous rcuprons les attributs du
client dans une requte simple de slection :

Bien qu'elle semble coter davantage cause de la sous-requte, le fait d'optimiser la cl de regroupement
amliore en principe les performances malgr l'opration de jointure supplmentaire (qui est quand mme une
opration sensible et en principe ultraoptimise dans un SGBD relationnel).

VII - Vous avez essay d'excuter une requte...


ne comprenant pas l'expression spcifie Year([DateCommande]) comme une partie de la fonction d'agrgat.

C'tait pourtant bien tent, merci d'avoir essay !


Voici la requte fautive, forcment produite par un clavier qui a fourch !

- 26 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 f-leb. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://f-leb.developpez.com/tutoriels/Access/Requete_avec_regroupement/

Les requtes avec regroupement par f-leb

Le champ calcul [AnneeCommande] a t accidentellement retir de la


cl de regroupement. Ds lors, [AnneeCommande] n'est plus agrg .
Au dpart vous vouliez regrouper par client et par anne de la commande mais par un clic malencontreux vous avez
sorti le champ calcul Anne([DateCommande]) de la cl de regroupement. Dans ce cas, non seulement il ne fait
plus partie de la cl de regroupement, mais en plus il ne fait l'objet d'aucune opration d'agrgation.
On reprend l'extrait du partitionnement engendr par le regroupement sur le seul [CodeClient] demand mais en
faisant apparatre le champ calcul Anne([DateCommande]):

- 27 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 f-leb. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://f-leb.developpez.com/tutoriels/Access/Requete_avec_regroupement/

Les requtes avec regroupement par f-leb

ALFKI a pass une commande en 2011 et trois en 2012, etc.


Puis on rcapitule le fil des diffrentes tapes d'excution de la requte :

parmi les enregistrements de [TblCommande], regrouper en sous-divisions les enregistrements ayant le


mme [CodeClient] ;
pour chaque sous-division, compter le nombre de commandes ;
puis pour chaque sous-division, faire une synthse en retournant une ligne qui comportera les champs
[CodeClient], [NbCommandes] et Anne([DateCommande]) (cases afficher coches).

C'est dans cette dernire tape que le bt blesse. En demandant l'affichage de l'anne de commande dans chaque
sous-division alors qu'il peut y en avoir plusieurs par sous-division (ici les annes 2011 et 2012), Access est incapable
d'en faire une synthse dans une seule ligne.

- 28 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 f-leb. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://f-leb.developpez.com/tutoriels/Access/Requete_avec_regroupement/

Les requtes avec regroupement par f-leb

Dans la sous-division WOLZA , impossible de faire une synthse d'une ligne sur l'anne.
Quelle anne prendre, sur quelle opration d'agrgation ? 2011, 2012 ? 2011,5 ???
D'o le message d'erreur.
De l, on peut en tirer une rgle gnrale sous Access :
Tout champ non agrg dans la liste des champs affichs (avec la case Afficher
coche) doit figurer dans la cl de regroupement (opration : regroupement ).
Autrement dit, les requtes avec regroupement peuvent afficher un champ uniquement
si ce champ fait partie de la cl de regroupement, ou s'il apparat dans une fonction
d'agrgation.

VIII - Et le code SQL ?


Vous avez sans doute dj bascul une requte en Mode SQL . Pour voir

Pour les commandes avec livraison en France, afficher les clients et leur
nombre de commandes si ceux-ci ont pass plus de cinq commandes
Ainsi, pour une requte de regroupement en langage SQL, vous trouverez une structure du genre :
1.
2.
3.
4.
5.

SELECT listechamps
FROM Table
WHERE Condition1
GROUP BY ClRegroupement
HAVING Condition2

- 29 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 f-leb. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://f-leb.developpez.com/tutoriels/Access/Requete_avec_regroupement/

Les requtes avec regroupement par f-leb

6. ORDER BY ListeChamps2;

La premire ligne SELECT fait rfrence aux champs avec la case Afficher coche dans le QBE. Vous y trouverez
les oprations d'agrgations comme Count (pour Compte), Sum (pour Somme), First (pour Premier), etc.
La deuxime ligne avec FROM fait rfrence aux tables/requtes participant la requte avec les jointures INNER
JOIN, LEFT JOIN ou RIGHT JOIN comme dessines dans le QBE.
La troisime ligne WHERE permet d'oprer une restriction au sein des enregistrements. On rappelle que la restriction
est effectue avant que le regroupement ne soit effectif. Dans le QBE, la restriction sur un champ s'opre avec
l'opration O avec la condition de restriction la ligne critre situe en dessous.
la suite de la clause GROUP BY de la quatrime ligne, on trouve les diffrents champs de la cl de regroupement
spars par une virgule.
Dans la cinquime ligne avec HAVING, on opre des restrictions sur des fonctions d'agrgation, du style :
HAVING Count(*)>5

pour restreindre aux sous-divisions donnant un comptage suprieur 5.


La dernire ligne avec ORDER BY permet d'oprer des tris dans le rsultat retourn. Elle apparat lorsque dans le
QBE vous compltez les lignes avec Tri Croissant ou Dcroissant .
Le langage SQL est videmment trs riche (celui d'Access sans doute moins) mais faire la bascule de temps autre
entre le mode graphique et le mode SQL vous permettra d'aborder plus facilement la syntaxe de ce langage. Et puis
quand viendra le temps de vous jeter l'eau, vous serez mme d'exploiter vos requtes SQL par copier-coller dans
vos programmes en langage VBA (cf. le tutoriel : Modifier une instruction SQL (ou requte), en Visual Basic).
Vous pourriez alors nager en eaux plus profondes et mme sortir des requtes abyssales (l'affaire d'un autre article
peut-tre), non interprtables graphiquement dans le QBE, mlant sous-requtes imbriques, corrles et autres
ressources qu'offre le langage SQL.

IX - Best of de requtes avec regroupement


Ici je propose un recueil de requtes avec Somme et Compte et qui reviennent rgulirement dans nos forums.
l'heure o j'cris ces lignes, certaines de ces requtes avec regroupement et qui mriteraient d'apparatre dans ce
Best of ont pu m'chapper. N'hsitez pas me contacter par MP si le cas se prsente.

IX-A - Comptage sur une sous-requte qui isole des enregistrements distincts
Si vous souhaitez dnombrer les clients ayant command par anne civile, la requte qui suit vous retournera un
rsultat faux :

- 30 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 f-leb. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://f-leb.developpez.com/tutoriels/Access/Requete_avec_regroupement/

Les requtes avec regroupement par f-leb

Ceci parce qu'un mme client ayant command, par exemple, trois fois dans l'anne sera compt trois fois. Ce que
vous vouliez en fait, c'est le nombre de clients distincts ayant command dans l'anne.

Le client ALFKI a pass trois commandes en 2012, ce client sera compt trois fois !
Pour cela, Access vous oblige passer par une sous-requte intermdiaire ne listant qu'une seule fois les
clients ayant pass commande par anne civile (en supprimant les doublons sur le couple ([CodeClient],
[AnneeCommande]) :

- 31 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 f-leb. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://f-leb.developpez.com/tutoriels/Access/Requete_avec_regroupement/

Les requtes avec regroupement par f-leb

On dnombre ensuite les clients en interrogeant la sous-requte :

IX-B - Reprer des doublons


Un classique du genreLa plaie des bases de donnes, les doublons.
Si la table des employs comporte deux fois les mmes nom et prnom, il peut s'agir d'un homonyme mais il est
aussi probable que ce soit la mme personne saisie deux fois.
Ce genre de doublons n'est pas difficile reprer, il suffit de mettre les champs [Nom] et [Prnom] dans la cl de
regroupement et retourner les sous-divisions dnombrant au moins deux enregistrements. Par exemple :

- 32 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 f-leb. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://f-leb.developpez.com/tutoriels/Access/Requete_avec_regroupement/

Les requtes avec regroupement par f-leb

Si vous voulez voir comment Access se dbrouille avec les doublons, inspirez-vous des requtes proposes par
l'assistant :

IX-C - Somme ou Compte


La table TblProduit comporte un champ boolen (de type Oui/Non ) nomm [Indisponible] :

Si on souhaite dnombrer les produits indisponibles par catgorie de produit, voici ce que l'on pourrait composer
avec le QBE d'Access :

- 33 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 f-leb. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://f-leb.developpez.com/tutoriels/Access/Requete_avec_regroupement/

Les requtes avec regroupement par f-leb

On restreint les enregistrements aux seuls produits ayant le marqueur [Indisponible] Vrai avant d'effectuer le
regroupement puis le comptage.
Sous Access, quel que soit le format d'affichage du champ boolen Oui/Non , Vrai/Faux ou Actif/Inactif ,
celui-ci est stock sous une forme numrique avec :

[Inactif]=-1 si Vrai , Oui ou Actif


[Inactif]=0 si Faux , Non ou Inactif

Vous pouvez tester la requte suivante en utilisant la fonction de conversion en entier CEnt pour vous en convaincre :

Ds lors, nous pouvons aussi obtenir notre comptage en sommant les valeurs numriques sous-jacentes au champ
boolen (au signe prs), ce qui donne une autre version du mme comptage :

- 34 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 f-leb. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://f-leb.developpez.com/tutoriels/Access/Requete_avec_regroupement/

Les requtes avec regroupement par f-leb

Notez le signe - devant l'opration Somme.


Si cette astuce semble simplifier la requte dans son criture, il vous appartient de vrifier sa pertinence du point de
vue des performances sur des tables volumineuses.
Mais imaginons que l'on souhaite en plus connatre le nombre d'alertes de rapprovisionnement par catgorie de
produit. Les alertes doivent tre dclenches partir du moment o [UnitesEnStock] devient infrieur ou gal
[NiveauReappro].
On pourrait calculer un boolen qui vaudrait 1 si [UnitesEnStock]<=[NiveauReappro] et 0 sinon avec l'instruction
VraiFaux :
VraiFaux([UnitesEnStock]<=[NiveauReappro];1;0)

On se ramne alors au cas prcdent avec le champ [Indisponible]. Il ne reste plus qu' faire la somme :

Et voil comment avec deux oprations Somme obtenir deux comptages conditionnels suivant la disponibilit
et le niveau du stock.

IX-D - Calculer un rang par catgorie


Cette fois nous partons d'une table (temporaire) TblCA2012 avec le chiffre d'affaires 2012 pour chaque produit :

- 35 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 f-leb. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://f-leb.developpez.com/tutoriels/Access/Requete_avec_regroupement/

Les requtes avec regroupement par f-leb

L'objectif est d'obtenir les cinq meilleurs CA avec le rang, ceci par catgorie de produit :

Il y a plusieurs faons de rsoudre le problme, comme celle inspire des sources Access :
Classer les rsultats d'une requte
Si toutefois vous tes fch avec le mchant SQL, la solution prsente qui suit (entirement ralise dans l'interface
QBE) oblige passer par une sous-requte intermdiaire :

- 36 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 f-leb. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://f-leb.developpez.com/tutoriels/Access/Requete_avec_regroupement/

Les requtes avec regroupement par f-leb

Celle-ci, pour chaque produit, va dnombrer les produits (champ calcul [NbProd]) de la mme catgorie (grce la
jointure avec TblCA2012_1) qui ont un chiffre d'affaires suprieur (grce au critre de l'opration O ).

D'aprs le rsultat intermdiaire ci-dessus, le produit identifi 1 sera au cinquime rang de sa catgorie en termes
de chiffre d'affaires puisque la sous-requte ramne quatre produits de la mme catgorie ayant un chiffre d'affaires
strictement suprieur.
Le premier tage de la fuse pour le calcul du rang est prt. Vous noterez la jointure de la table TblCA2012 avec
elle-mme (reprsente via l'alias TblCA2012_1, obtenu en ajoutant une deuxime fois TblCA2012 dans la fentre).
Il reste conclure avec la requte principale de slection :

- 37 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 f-leb. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://f-leb.developpez.com/tutoriels/Access/Requete_avec_regroupement/

Les requtes avec regroupement par f-leb

Le rang d'un produit en termes de CA est le nombre de produits de la mme catgorie ayant un CA strictement
suprieur, auquel on rajoute 1.
Les meilleurs produits (avec le rang gal 1) ne sont pas retourns par la sous-requte puisqu'aucun produit de la
mme catgorie n'a de CA suprieur.
D'o la ncessit d'une jointure de type 2 entre TblCA2012 et SousReq_CA, en plus de la fameuse fonction
Nz dans le calcul du rang.
Nz([NomDuChamp]; Valeur si Null)

X - Rfrences pour aller plus loin

Quelques dfinitions en usage dans l'univers des SGBDR et du SQL


Le SQL de A Z : 4e partie - groupage et ensembles
Dmythifier le GROUP BY
Guide d'optimisation de vos applications Microsoft Access (III-E. Requtes)

XI - Conclusion
Vous voil arms pour composer vos requtes de regroupement en djouant les piges (le cas des champs Null).
Vous n'aurez mme aucun mal tendre vos connaissances aux oprateurs d'agrgation passs sous silence dans
ce tutoriel (comme les classiques Moyenne , Max et Min ).

XII - Remerciements
Je remercie Pierre Fauconnier et CinePhil pour leur prcieuse aide technique.
Je remercie galement l'ami ClaudeLeloup pour sa relecture orthographique.

- 38 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright 2012 f-leb. Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation
expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page est dpose la SACD.

http://f-leb.developpez.com/tutoriels/Access/Requete_avec_regroupement/