Carte du site
 Remerciements
 Netiquette
 Bugs
 Tables
 Requêtes
 Formulaires
 États (rapports)
 Modules
 APIs
 Chaînes
 Date/Time
 Général
 Ressources
 Téléchargeables

 Termes d'usage

Requêtes: Trouver les X possédant tous les Y requis

Author(s)
Michel Walsh

--- Soumis par Michel Walsh ---

Trouver les X possédant tous les Y requis.

    Une question relativement générale consiste à obtenir la liste des candidats ayant toutes les compétences requises. Une solution proposé il y a quelques temps par  John L. Viescas  nous permet d'écrire une requête qui répond tout simplement à cette question.

    Créer une table des compétences désirées,  DesiredSkills (un champ, SkillID, indexé sans doublon (ou clé primaire)), avec un enregistrement par compétence désirée (option, ajouter un second champ, Weight).

    Créer une autre table, fournissant la combinaison des candidats et de leur compétence,  CandidatesSkills (deux champs: CandidateID, SkillID; en faire un index combiné, sans doublon, ou en faire une clé primaire combinée). Avoir un enregistrement par paire différente candidat-compétence..

    Amener les deux tables dans la grille pour faire une nouvelle requête. Joindre les deux champs SkillID. 

    Amener le champ CandidateID dans la grille, cocher pour le voir. Passer en mode vue de résultat. Visiblement, le "inner join" retourne le  candidateID "n" fois, n étant le nombre de fois qu'une compétence désirée est possédée par le candidat.

    Revenir en mode design. Cliquer sur le bouton de sommation, sur la barre d'outils (toolbar), de sorte à obtenir une nouvelle ligne dans la grille, la ligne Total. Si ce n'est déjà fait, amener le champ CandidateID dans la grille. Conserver le GroupBy proposé. Amener le champ DesiredSkills.SkillID dans la grille, changer le GroupBy en un Count.

    Passer en vue des résultats et observez la valeur "n" dont on discutait plutôt.

    Si il y a "m" compétences désirées, visiblement, on désire seulement les enregistrements où n=m.

    En mode design, à la ligne des critères, sous le champ  SkillID:

= (SELECT Count(*) FROM DesiredSkills;)

    ce qui est la valeur  "m".

    Vérifier les résultats, cela devrait correspondre à ce qui est désiré. Prenons, par exemple, les données suivantes:

DesiredSkills
SkillID
"Est animé"
"Est sonorisé"

CandidatesSkills
"Merlin", "vit dans le passé"
"Genie", "vit dans le passé"
"Robot", "vit dans le futur"
"Merlin", "Est animé"
"Genie", "Est animé"
"Robot", "Est animé"
"Merlin", "Est sonorisé"

    vous devriez ne retrouver que Merlin car il est le seul à satisfaire aux compétences exigées dans la table DesiredSkills. On voit également qu'une table peut, en fait, être un "argument" à une procédure. En fait, c'est très pratique si il y a une "liste" d'arguments, de passer la liste dans une table!

   Maintenant, si les critères ne sont pas "absolus", mais "préférés", ajouter un champ  Weight à la table  DesiredSkills, et, plutôt que de compter  DesiredSkills.SkillID, en faire une somme avec SUM sur le champ Weight, qu'on triera en ordre croissant par la suite. De plus, si on possède un mélange de compétences essentielles et de compétences préférées, on procède de la même façon. Sommer mentalement tous les points des compétences désirées (ne pas inclure les compétences essentielles) et lui ajouter un petit quelque chose, obtenant la valeur M. Prendre cette valeur M comme poids de compétence essentielle. Il ne reste alors, dans la requête, que de sommer les poids et d'ajouter une requête du genre:

>= (SELECT M*Count(*) FROM DesiredSkills;)

    où M est la constante calculée, puis, de trier le résultat.

DesiredSkills
SkillID, Weight
"Est animé", absolument Requis
"est sonorisé", 0.3
"vit dans le passé", 0.25
"vit dans le futur", 0.20

    Seul "Est animé" est requis, calculons son poids comme plus grand que 0.3+0.25+0.2, ici, on utilisera AbsolumentRequis= 1.00; finalement, trié en ordre: Merlin est bon premier (1.55), Genie bon second (1.25) et Robot est dernier(1.20). Puisque toutes les compétences non essentielles, additionnées ensemble, ne font pas une somme >= M, nous sommes certains que seuls les candidats possédant TOUTES les compétences essentielles seront listés. Joli départ pour une analyse à critères multiples!

© 1998-2001, Dev Ashish, All rights reserved. Optimized for Microsoft Internet Explorer