I am having trouble wrapping my brain around a nested sub query in a select sql statement. Basically what I have here works fine, but there definitely must be a way to make this query more dynamic and elegant than the current setup below:
SELECT Jobs.JobID, Jobs.JobName,
(
SELECT COALESCE(SUM(JobQualifiers.Weight), 0)
FROM Jobs j1
INNER JOIN
JobQualifiers ON j1.JobID = JobQualifiers.JobID
INNER JOIN
Qualifications ON Qualifications.QualificationID = JobQualifiers.QualificationID
INNER JOIN
SubGroupQualifiers sgq ON Qualifications.QualificationID = sgq.QualificationID
INNER JOIN
QualificationSubGroups ON QualificationSubGroups.QualificationSubGroupID = sgq.SubGroupID
WHERE
j1.JobID = Jobs.JobID
AND
QualificationSubGroups.QualificationSubGroupID = 6
) as SubGroup6,
(
SELECT
COALESCE(SUM(JobQualifiers.Weight), 0)
FROM Jobs j2
INNER JOIN
JobQualifiers ON j2.JobID = JobQualifiers.JobID
INNER JOIN
Qualifications ON Qualifications.QualificationID = JobQualifiers.QualificationID
INNER JOIN
SubGroupQualifiers sgq ON Qualifications.QualificationID = sgq.QualificationID
INNER JOIN
QualificationSubGroups ON QualificationSubGroups.QualificationSubGroupID = sgq.SubGroupID
WHERE
j2.JobID = Jobs.JobID
AND
QualificationSubGroups.QualificationSubGroupID = 7
) as SubGroup7,
(
SELECT COALESCE(SUM(JobQualifiers.Weight), 0)
FROM Jobs j3
INNER JOIN
JobQualifiers ON j3.JobID = JobQualifiers.JobID
INNER JOIN
Qualifications ON Qualifications.QualificationID = JobQualifiers.QualificationID
INNER JOIN
SubGroupQualifiers sgq ON Qualifications.QualificationID = sgq.QualificationID
INNER JOIN
QualificationSubGroups ON QualificationSubGroups.QualificationSubGroupID = sgq.SubGroupID
WHERE
j3.JobID = Jobs.JobID
AND
QualificationSubGroups.QualificationSubGroupID = 8
) as SubGroup8
FROM Jobs
My goal here is to make the subquery selection dynamic instead of hardcoded to a QualificationSubGroups.QualificationSubGroupID with Subgroup6, SubGroup7, SubGroup8 etc. I believe I need a nested subquery, but how to implement it is beyond me. This may be incredibly ambiguous of a description so I'd be happy to give more detail as needed! Thanks ahead for any responses.
Instead of multiple subselects you could use conditional aggregation, something like:
SELECT j.JobID
, j.JobName
, COALESCE(SUM(CASE WHEN qsg.QualificationSubGroupID = 6 THEN jq.Weight END), 0)
, COALESCE(SUM(CASE WHEN qsg.QualificationSubGroupID = 7 THEN jq.Weight END), 0)
, COALESCE(SUM(CASE WHEN qsg.QualificationSubGroupID = 8 THEN jq.Weight END), 0)
FROM Jobs j
INNER JOIN JobQualifiers jq ON j.JobID = jq.JobID
INNER JOIN Qualifications q ON q.QualificationID = jq.QualificationID
INNER JOIN SubGroupQualifiers sgq ON q.QualificationID = sgq.QualificationID
INNER JOIN QualificationSubGroups qsg ON qsg.QualificationSubGroupID = sgq.SubGroupID
WHERE qsg.QualificationSubGroupID IN (6,7,8)
GROUP BY j.JobID
, j.JobName
I am not sure exactly what you are trying to do but you can try like below using a CASE
condition
SELECT Jobs.JobID, Jobs.JobName,
CASE WHEN QualificationSubGroups.QualificationSubGroupID = 6
THEN COALESCE(SUM(JobQualifiers.Weight), 0) END as SubGroup6,
CASE WHEN QualificationSubGroups.QualificationSubGroupID = 7
THEN COALESCE(SUM(JobQualifiers.Weight), 0) END as SubGroup7,
CASE WHEN QualificationSubGroups.QualificationSubGroupID = 8
THEN COALESCE(SUM(JobQualifiers.Weight), 0) END as SubGroup8
FROM Jobs j1
INNER JOIN
JobQualifiers ON j1.JobID = JobQualifiers.JobID
INNER JOIN
Qualifications
ON Qualifications.QualificationID = JobQualifiers.QualificationID
INNER JOIN
SubGroupQualifiers sgq
ON Qualifications.QualificationID = sgq.QualificationID
INNER JOIN
QualificationSubGroups
ON QualificationSubGroups.QualificationSubGroupID = sgq.SubGroupID
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.