Professional Documents
Culture Documents
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.
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/
I - Introduction
quelles occasions a-t-on besoin d'oprer des regroupements dans une requte Access ?
(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/
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/
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/
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/
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/
Min
Max
First
Last
StDev
Var
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.
-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/
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/
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/
(4)
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/
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/
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 :
- 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/
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/
Faisons le bilan :
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]))
http://f-leb.developpez.com/tutoriels/Access/Requete_avec_regroupement/
Nz([remise];0)
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/
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/
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/
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.).
- 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/
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/
http://f-leb.developpez.com/tutoriels/Access/Requete_avec_regroupement/
[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 :
- 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/
[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/
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).
- 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/
- 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/
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).
- 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/
- 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/
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/
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.
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/
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
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/
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/
- 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/
Si vous voulez voir comment Access se dbrouille avec les doublons, inspirez-vous des requtes proposes par
l'assistant :
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/
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 :
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/
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.
- 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/
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/
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/
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)
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/