http://www.info-3000.com/access/supportdecours/lecon26/lecon26.htm

Leçon 26 : Requêtes : Les tris et les premières valeurs

Pour suivre cette leçon, vous devez avoir suivi les leçons précédentes. Ou plus précisément, vous devez être en possession de la base de données procd.mdb telle qu'elle était à la fin de la leçon précédente. Si vous n'êtes pas certain de l'avoir, vous pouvez la télécharger ici

Résumé de la leçon précédente

La dernière fois, avons vu comment extraire des dates ou des plages de dates. Nous avons vu qu'il ne faut pas confondre les dates et les années. Nous avons également abordé la possibilité d'extraire des enregistrements qui ne contiennent rien, ainsi que la possibilité d'extraire les gens décédés (Oui ou Non). Enfin, nous avons vu qu'il est possible de masquer certaines colonnes si besoin est.

Aperçu de cette leçon

Dans cette leçon, nous allons voir comment faire pour trier plusieurs colonnes en même temps, ainsi que la manière d'extraire seulement les valeurs extrêmes d'une plages de valeurs, comme la liste des 5 personnes les plus agées, ou les 3 personnes les plus riches

Créez une nouvelle requête, comme d'habitude, et placez dans cet ordre : . Si vous lancez requête telle quelle, vous aurez la liste simple de tous les gens, dans l'ordre dans lequel elles ont été rentrées. Vous pouvez bien entendu toujours trier par n'importe quelle colonne avec le bouton droit de votre souris, et en choisissant Tri Croissant, mais ce tri ne sera pas mémoriser. Nous allons voir dans cette leçon qu'il possible de mémoriser les tris avec la requête.

Revenez ou restez en mode création de cette requête. Cliquez dans la zone Tri de Domaine : . En cliquant dans cette zone, ça fait apparaître une petite flèche. Si vous cliquez sur cette petite flèche, vous pouvez choisisr entre

Choisissez Tri croissant pour le domaine : . Lancez la requête : Vous constatez que tout le monde est là, et que les domaines sont triés par ordre alphabétique : D'abord ceux qui n'ont pas de domaine, ensuite ceux qui ont le domaine ??, puis ???, puis Affaires, Chanson, etc... Une fois de plus, nous constatons quelques erreurs de saisie : Pourquoi atrribuer ?? ou ??? à des gens dont le domaine est inconnu... Autant le laisser en blanc ! Ne changez rien : Laissons volontairement ces erreurs.

Astuce : Plutôt que de cliquer sur la petite flèche pour choisir Croissant, vous pouvez double-cliquer directement dans la zone de tri : . Croissant apparait automatiquement. Si vous recliquez encore deux fois sur Croissant, il se transforme en Décroissant, et encore deux clics, le tri disparait.

Alors, cette première colonne est bien triée, mais pas les autres...

Exactement.

Bon, c'est normal : Je comprend bien que si on trie par le pays d'origine, forcément, le domaine ne sera plus trié. On ne peut trier qu'une colonne à la fois

Eh bien, justement, non ! Nous allons pouvoir trier par plusieurs colonnes en même temps. Démonstration : Demandez le tri alphabétique EGALEMENT sur PaysOrigine : .Lancez la requête, et regardez bien ce qui se passe : A première vue, rien n'a changé, la table est toujours triée par ordre alphabétique du Domaine. Mais regardons de plus près une série de données : Ceux qui font de la chanson :

Les pays sont triés alphabétiquement pour chaque domaine : D'abord ceux qui n'ont pas de pays (Jennifer Lopez), ensuite : Belgique, Canada, Etats-Unis, France, Pays-Bas et Royaume-Uni.

Ah d'accord ! Et à chaque changement de domaine, le tri recommence de A à Z sur le pays !

Exactement. Et nous allons continuer : Prenons les "Chanson" de France : . Ils ne sont pas du tout dans l'ordre : Célibataire, Rien, Célibataire, Marié(e), Divorcé(e), Marié(e), Marié(e), ... C'est n'importe quoi !

OK ! Compris ! Il suffit de mettre le tri croissant dans l'EtatCivil !

Exactement. C'est ça ! Tiens, on va même faire une petite variante puisque vous avez bien compris : Ne choisissez pas Croissant, mais Décroissant : . Lancez la requête, et regardez principalement ce qui se passe au niveau des "Chanson", "France" : Les états civils sont triés en ordre alphabétique inverse : Marié(e), Divorcé(e), Célibataire, et Rien.

Et maintenant, si je veux que tous les "Chanson", "France", "Marié(e)" soient triés par ordre alphabétique su nom, je demande un tri croissant du prénom et du nom ?

Non, pas du prénom, justement. Vous demandez juste l'ordre alphabétique du nom, parce que sinon, il va d'abord mettre le prénom par ordre alphabétique, et ensuite les noms, ce qui est idiot. Faites donc : , et lancez la requête. Regardez principalement la section des Chanson - France - Marié(e) :. Ils sont triés par ordre alphabétique du nom de famille : Brassens, Cabrel, Gainsbourg, Goya et Hallyday...

Sauvegardez cette requête sous R_CelebriteMultiCleDeTri, avec la description "Tri par Domaine, Pays, EtatCivil et NomClient"

C'est toujours un tri de gauche à droite alors...

Exactement. Toujours.

Donc, si par exemple j'intervertis les 2 premières colonnes, que je met le pays en premier lieu, et ensuite le domaine, il va trier d'abord les pays, et pour un même pays, il va trier les domaines ?

Oui. D'ailleurs, faites le test : Restez dans cette requête, et déplacez le Pays de manière à ce que ce soit la première colonne. Eh oui, ce sont de bien vieux souvenirs cette histoire de déplacement de colonnes. Revoyez la leçon 21 pour vous rafraîchir la mémoire si besoin est. Une fois que vous avez cette disposition : , lancez votre requête.

Faites Fichiers/Enregistrer SOUS : R_CelebriteMultiCleDeTri2 avec la description "Tri par Pays, Domaine, EtatCivil et NomClient"

Et on aurait pu encore affiner, si on avait mis le nom avant le prénom, on aurait pu trier par vraiment toutes les colonnes : , comme ça, si par exemple, on avait eu plusieurs fois le même nom de famille, Access les aurait triés par ordre alphabétique des prénoms (Dupont André, Dupont Charles, Dupont Ernest, ...)

Oui. Nous ne l'avons pas fait, parce que dans notre cas ç'aurait été un peu idiot, nous n'avons absolument pas assez de données pour que ce soit représentatif (A part Hallyday qui est représenté 2 fois (Johnny et David), il n'y a pas vraiment d'autres exemples dans notre table).


Nous allons maintenant regarder une intéressante fonction d'Access, plus ou moins liée aus tris : C'est la fonction "Première valeurs". Créez une nouvelle requête, comme d'habitude, avec les champs Nom, Prénom et SalaireMensuel. Demandez le tri décroissant par salaireMensuel seulement : . Ce qui aura pour effet de donner la liste de tous les gens, les plus riches en premier lieu.

Admettons maintenant que vous désiriez afficher seulement les 5 personnes les plus riches de votre table : Cliquez sur cette petite déroulante, dans la barre d'outils, au dessus de votre écran, sous les menus : , et choisissez 5 : . Lancez la requête : . Vous obtenez effectivement les 5 premières personnes les plus riches.

Sauvegardez cette requête sous R_Celebrite5LesPlusRiche (Ne quittez pas cette requête)

Je suppose qu'on est pas obligé de choisir ce qui existe dans la liste (5, 25, 100), on peut écrire un autre chiffre ?

Bien sûr, oui.

Donc, si je met 1, j'ai juste la personne la plus riche ?

Oui. Essayez : Ecrivez 1 dans cette liste et lancez la requête

Faites Fichier/EnregistrerSous : R_CelebriteLaPlusRiche

Ca ne marche pas : Il me renvoie 2 personnes : !

Oui, mais ils gagnent tous les deux 30'000 francs... S'il n'en avait choisi qu'un çaurait été qui ? Stallone ou Sirven ?

C'est juste ! Dans ce cas, qu'on demande 1 ou 2, le résultat est le même... C'est vrai que c'est logique !

Oui. Parce qu'Access ne veut pas vous renvoyer au hasard l'un des deux. PAR CONTRE... Si vous aviez : , alors, çaurait été différent : En effet, commne vous avez 2 clés de tris : Le salaire ET le Nom, dans ce cas, il n'y a plus d'ambiguïté : Access trie donc d'abord par salaire, et, A SALAIRE EQUIVALENT, il tris par ordre alphabétique des noms... Ce qui fait que comme dans notre table, nous avons 2 personnes qui gagnent le même salaire : Stallone et Sirven, Access va les renvoyer par ordre alphabétique : D'abord SIrven, ensuite STallone. Et, dans ce cas, si vous demandez le résultat de la requête, il ne va plus renvoyer les deux personnes, mais effectivement SEULEMENT la première : Alfred SIrven : !

Faites Fichier/EnregistrerSous : R_CelebriteLaPlusRicheAlphabetique. Fermez cette requête, et mettez les descriptions suivantes dans ces 3 nouvelles requêtes :

J'ai vu que dans la liste déroulante des premières valeurs, on pouvait également indiqur un pourcentage ?

Oui. C'est le même principe. Par exemple, admettons que vous aimeriez obtenir les 10% des personnes les plus agées de votre liste, créez une nouvelle requête comme d'habitude, et demandez : , et écrivez 10% dans la zone des premières valeurs : . Lancez la requête.

Ca ne marche pas : Déjà, il devrait y avoir 10 personnes (10% de 100 personnes), là, il y en a 14... Et en plus, personne n'a de date de naissance !

Tout est normal : 14 personnes, c'est justement parce qu'il y a 14 personnes dont la date est inconnue, et comme c'est trié par ordre croissant de date de naissance, les dates vides sont placées en premier. En fait, il faudrait exclure les dates vides. Vous vous rappelez comment faire ?

Bien sûr ! je me rappelle de la leçon 25 : Il faut mettre Pas Null comme critère de DateNaissance !

Exactement. Essayez !

Sauvegardez cette requête sous R_Celebrite10PourCentLesPlusAgee. Donnez lui la desccription : DateNaissance : Ordre décroissant, Premières valeurs : 10%

C'est marrant : Il ne donne que 9 personnes... Comme nous avons 100 personnes, il devrait en donner au moins 10, non ?

Attention : Vous avez demandé la liste de toutes les personnes dont la date de naissance n'était pas nulle ! Il n'y a donc plus 100 personnes, mais 100 - 14 personnes sans dates = 86 personnes (on a vu un peu plus haut dans la leçon qu'il y avait 14 personnes sans date de naissance). 10% de 86 personnes, c'est 8.6 personnes. Comme il n'est pas possible évidemment d'afficher 8.6 personnes, Access en affiche 9.

Compris ! Bon finalement, ces premières valeurs ne sont absolument pas utiles s'il n'y a pas de tri sur au moins une colonne ?

Exactement.

Bon... Hem... On peut résumer ?

Les requêtes servent à extraire une partie des données d'une table, mais également à trier. Il est possible de trier sur un, deux ou quarante-sept champs... Les tris s'effectuent de gauche à droite : C'est d'abord la coonne la plus à gauche qui est triée, ensuite, vers la droite. Si la première colonne est Pays, et la deuxième est NomClient, Access va trier tous les pays par ordre alphabétique, et pour tous les habitants d'un même pays, ils seront alors triés par ordre alphabétique du nom. Le tri est étroitement lié avec la notion de Premières Valeurs. Il est possible d'extraire les 12 personnes les plus jeunes, ou les 27% des gens dont le salaire est le plus élevés, en utilisant la liste déroulante "Premièeres valeurs". En cas d'égalité, Access affiche les 2 ou plusieurs enregistrements comme s'il n'en s'agissait que d'un seul.

Avez-vous bien compris ?

  1. Je crée une requête basée sur T_Celebrite. Je place les champs Pays, EtatCivil et Prenom (dans cet ordre). Je demande un tri croissant sur les 3 champs. Quel enregistrement apparaîtra en premier ?
    a. Céline, Marié(e), Canada
    b. Britney, Célibataire, Etats-Unis
    c. Johnny, Célibataire, pays inconnu (vide) ***
    d. Michael, célibataire, Allemagne

  2. Je crée une requête basée sur T_Celebrite. Je place les champs NomClient et Prénom (sans Tri). Je demande les 3 premières personnes
    a. La requête ne donne aucun résultat
    b. La requête donne tous les résultats
    c. La requête donne les 3 premières personnes dans l'ordre alphabétique
    d. La requête donne les 3 premières personnes telles qu'elles apparaissent dans la table ***

  3. Je crée une requête basée sur T_Celebrite. Je place les champs Decede, Pays, NomClient, et Prenom (dans cet ordre). Je demande le tri sur tous les champs
    a. La requête va me renvoyer d'abord les gens Vivants, et ensuite les gens morts ***
    b. La requête va me renvoyer tous les gens triés par ordre alphabétique de leur pays, et ensuite par pays, les gens vivants et les gens morts
    c. Cette requête n'est pas possible (pas de tris possibles sur les champs Oui/Non)
    d. Aucun tri ne se fera (3 clés de tri maximum : Ici, il y en a 4)

  4. Je crée une requête basée sur T_Celebrite. Je place les champs Decede et NomClient, triés en ordre croissant par Decede, et NomClient. Je demande comme critère de Decede : Oui. Je demande la liste des 15% des premières valeurs
    a. J'obtiens les 15% des 100 personnes classées par ordre alphabétique (à peu ptès 15 personnes)
    b. J'obtiens les 15% des personnes décédées les plus proche de A alphabétiquement parlant (soit 15% des 22 personnes = 4 personnes) ***
    c. J'obtiens les 85% des personnes décédées les plus proche de A alphabétiquement parlant (soit 15% des 22 personnes = 4 personnes)

Pour voir les solutions, il vous suffit de sélectionner le questionnaire ci-dessus : 3 petites étoiles *** apparaîtront en face des bonnes réponses.

Exercice

Encore une fois, il ne s'agit pas de créer une nouvelle base de données, mais vous allez devoir créer quelques requêtes dans votre base de données ProCD. Toutes les requêtes seront basées sur T_Celebrite, et devront contenir au minimum le Prénom et le NomClient.

  1. Créez une requête qui extraira les 20% des américaines les plus riches
    Sauvegardez-là sous R_Celebrite20PourcentAmericaineLesPlusRiche
    Vous devriez obtenir 2 enregistrements (variable selon les paramètres d'extraction - USA - Etats-Unis - Mme etc...)
  2. Créez une requête qui donnera l'ensemble de tous les gens décédés, dont la date de naissance est connue, du plus jeune au plus vieux
    Sauvegardez-là sous R_CelebriteDecedeeJeuneVersVieux
    Vous devriez obtenir 22 enregistrements
  3. Créez une requête qui extraira les 50% des hommes politiques les plus agés
    Sauvegardez-là sous R_CelebritePolitique50PourcentLesPlusAge
    Vous devriez obtenir 5 enregistrements

Téléchargez la solution de l'exercice ici, qui n'est autre que ProCD telle qu'elle devrait être à la fin de cette leçon

Si vous n'êtes pas tout à fait certain d'avoir suivi correctement toutes les étapes de cette leçon, vous avez la possibilité de télécharger ici la version de procd.mdb exactement dans l'état ou elle devrait être à la fin de cette leçon.

Aperçu de la leçon suivante

Lors de la prochaine leçon, nous allons voir comment une seule requête peut contenir plusieurs résultats, en utilisant ce qu'on appelle un paramètre variable.