First - you need a list of all skillsets and using a left join to each of the two skill rating tables - and those rating tables need to be filtered for applicant and job respectively. Left joins will return all skills records and only those records in applicants and jobs where they exist
Evolving a query build your initial query might look something like this - at each change you can check you are getting the expected results
Code:
SELECT SkillDesc, ApplicatantID, JobID, AppskillT.exprating, JobSkillT.exprating
FROM (SkillT LEFT JOIN AppskillT ON SkillT.SkillID=AppskillT.SkillID) LEFT JOIN JobSkillT ON SkillT.SkillID=JobskillT.SkillID
WHERE (AppskillT.ApplicantID=[Enter ApplicantID] OR AppskillT.ApplicantID is null) AND (jobskillT.jobID=[Enter jobID] OR jobskillT.jobID is null)
However you only need to know the jobskill rating to sum, and you also need to calculate the product, so modify the query to. I've highlighted in red where the changes are
Code:
SELECT SkillDesc, ApplicatantID, JobID, JobSkillT.exprating, AppskillT.exprating * JobSkillT.exprating AS Product
FROM (SkillT LEFT JOIN AppskillT ON SkillT.SkillID=AppskillT.SkillID) LEFT JOIN JobSkillT ON SkillT.SkillID=JobskillT.SkillID
WHERE (AppskillT.ApplicantID=[Enter ApplicantID] OR AppskillT.ApplicantID is null) AND (jobskillT.jobID=[Enter jobID] OR jobskillT.jobID is null)
now you need to group and sum, so the query becomes this - note that skilldesc is also removed as it is no longer relevant
Code:
SELECT ApplicatantID, JobID, sum(JobSkillT.exprating) as Weighting, sum(AppskillT.exprating * JobSkillT.exprating) AS Product
FROM (SkillT LEFT JOIN AppskillT ON SkillT.SkillID=AppskillT.SkillID) LEFT JOIN JobSkillT ON SkillT.SkillID=JobskillT.SkillID
WHERE (AppskillT.ApplicantID=[Enter ApplicantID] OR AppskillT.ApplicantID is null) AND (jobskillT.jobID=[Enter jobID] OR jobskillT.jobID is null)
GROUP BY ApplicatantID, JobID
finally you only want the weighted average so modify the query to
Code:
SELECT ApplicatantID, JobID, sum(AppskillT.exprating * JobSkillT.exprating)/sum(JobSkillT.exprating) AS ExperienceScore
FROM (SkillT LEFT JOIN AppskillT ON SkillT.SkillID=AppskillT.SkillID) LEFT JOIN JobSkillT ON SkillT.SkillID=JobskillT.SkillID
WHERE (AppskillT.ApplicantID=[Enter ApplicantID] OR AppskillT.ApplicantID is null) AND (jobskillT.jobID=[Enter jobID] OR jobskillT.jobID is null)
GROUP BY ApplicatantID, JobID
Hope taking you through the steps helps you understand the requirements. Note this is 'aircode' so there may be the odd error in there