Home
Home

--- 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. Jonidre les deux champs SkillID. 

    Amener le champ CandidateID sur 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'un compétence désirée est possédée par le candidat.

    Revenir en mode design. Cliquer sur le bouton de sommation, sur le toolbar (barre d'outil), 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é. Amenerle 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.

    Maintenane, si les critères ne sont pas "absous", 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. 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 poind 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 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ère multiple!