Une requête analyse croisée est l'équivalent du tableau croisé dynamique dans Excel. Elle permet d'obtenir des statistiques par ligne et par colonnes. La seule restriction par rapport à Excel est que dans Access, on ne peut avoir qu'un champ de regroupement par colonne
Une requête analyse croisée peut se fonder sur plusieurs tables
Elle se compose de 3 éléments minimum (3 champs minimum donc également) :
Dans notre exemple :
Dans l'exemple simple suivant, nous avons la table suivante :
IDJouet |
Libelle |
Sexe |
AgeMin |
Genre |
AvecPile |
ResteStock |
PU |
1 |
Ours en peluche | Fille |
66 |
Poupées et peluches |
Non |
9 |
CHF 16.50 |
2 |
Train électrique | Garçon |
8 |
Divers |
Oui |
2 |
CHF 189.00 |
3 |
Boomerang | Garçon |
6 |
Dînette |
Non |
20 |
CHF 12.90 |
4 |
assiette | Fille |
2 |
Dînette |
Non |
80 |
CHF 5.00 |
5 |
MarioLand | Garçon |
8 |
Jeux Vidéo |
Non |
4 |
CHF 89.90 |
6 |
Monopoly | Mixte |
12 |
Jeux de société |
Non |
6 |
CHF 99.00 |
7 |
7 familles | Mixte |
5 |
Jeux de société |
Non |
8 |
CHF 6.75 |
8 |
Goldorak | Garçon |
6 |
Poupées et peluches |
Oui |
10 |
CHF 29.00 |
9 |
Barbie à la mer | Fille |
4 |
Poupées et peluches |
Non |
2 |
CHF 21.00 |
10 |
voiture électrique | Garçon |
6 |
Divers |
Oui |
1 |
CHF 229.00 |
11 |
Casino Deluxe | Mixte |
18 |
Jeux Vidéo |
Non |
0 |
CHF 109.90 |
12 |
Casimir | Mixte |
5 |
Poupées et peluches |
Non |
2 |
CHF 19.90 |
13 |
Playmobil | Mixte |
3 |
Divers |
Non |
13 |
CHF 9.90 |
14 |
Voiture télécommandée | Garçon |
10 |
Divers |
Oui |
4 |
CHF 65.00 |
15 |
ballon | Mixte |
2 |
Divers |
Non |
25 |
CHF 8.60 |
A partir de là, nous aimerions obtenir la statistique suivante : Combien d'articles nous reste-t-il pour chaque catégorie de jouet, et pour chaque sexe :
Pour ce faire, nous avons besoin de la requête style Analyse Croisée suivante :
Qui est représenté par le code SQL Suivant :
TRANSFORM Sum(T_Jouet.ResteStock) AS SommeDeResteStock
SELECT T_Jouet.Sexe
FROM T_Jouet
GROUP BY T_Jouet.Sexe
PIVOT T_Jouet.Genre;
TRANSFORM Sum(T_Jouet.ResteStock) AS SommeDeResteStock | Cette instruction est exclusive à la requête analyse croisée. Le titre de ce champ SommeDeResteStock n'apparaît pas dans le résultat (seulement les données). On peut donc utiliser les fonctions de regroupement habituelles : SUM, COUNT, MAX, MIN, AVG, Etc. |
SELECT T_Jouet.Sexe | Ce titre apparaître ligne par ligne, autant de fois qu'il existe de sexe. Dans notre exemple, nous aurions peut-être dû mettre le Genre en ligne, pour éviter d'avoit un tableau plus large que haut |
FROM T_Jouet | Tables de base servant à l'élaboration de la requête. On peut bien entendu avoir plusieurs tables (dans le cas ou par exemple, on désirerait avoir un regroupement des achats des clients par genre d'article, ce qui demanderait une table T_Client, T_Vente, T_VenteDetail et T_Article) |
GROUP BY T_Jouet.Sexe | Cette ligne permet de créer aurant de colonnes que nécessaires (une colonne par Sexe différent (ici, 3 colonnes : Garçon, Fille, Mixte)) |
PIVOT T_Jouet.Genre; | Ce champ doit être unique (pas question d'avoir PIVOT Genre, AvecPile). C'est la détermination du nombre de colonnes et le titrage de chacune d'entre elle avec un genre différent |
Il est possible d'affiner le tableau en demandant plusieurs champs comme en-tête de ligne (mais pas comme en tête de colonne représentées pas PIVOT). Par exemple, si on voulait presque la même statistique, on aurait ceci :
Dans cet exemple, nous avons 2 en-têtes de ligne : Genre et AvecPile (dans l'exemple précédent, Genre était une en-tête de colonne). Nous obtenons donc les articles restants pour chaque genre, et, AvecPile oui ou non. On constate donc que tout n'est pas représenté, simplement parce qu'il existe certains genres d'articles qui n'existent qu'avec ou sans piles (Le genre Dînette n'existe que sans pile, tandis que le genre Poupées et peluches comprend cerzains articles avec et d'autres sans piles)
TRANSFORM Sum(T_Jouet.ResteStock) AS SommeDeResteStock
SELECT T_Jouet.Genre, T_Jouet.PileNecessaire
FROM T_Jouet
GROUP BY Genre, AvecPile
PIVOT T_Jouet.Sexe;
Le GROUP BY contient donc autant d'enregistrement que souhaité
Comme on peut le constater, les noms de colonnes sont variables : Non seulement leur nom, mais aussi leur nombre (on peut imaginer un jour changer les sexes, et tout a coup avoir comme sexes : Petits garçons, petites filles, mixte, adultes).
Cela ne pose a priori pas de problème dans la requête.
Cela ne poserait pas de problème non plus dans un simple formulaire.
Mais dans le cas ou cette requête serait la source dun sous-formulaire, le problème des champs dynamiques se pose.
Admettons le cas (peu probable, mais il faut bien donner un exemple), que nous concevions un formulaire principal, avec pour seul champ " PileIncluse ", qui serait le champ père dans le formulaire principal et le sous formulaire.
Lors du lancement du formulaire principal, Access va nous renvoyer un message derreur qui nous demande de fixer les en-têtes de colonnes dans la requête source (ce qui est compréhensible, puisque comme on a vu, les sexes peuvent changer)
Aller dans la requête, demander les propriétés de la requête, et dans la propriété En-têtes des colonnes, écrire : "Garçon";"Fille";"Mixte"
Ce qui force les titres des colonnes à devenir statiques