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!
|