Reputation: 2146
I have a sql query which is working perfectly to return the number of hours a worker is working in any particular job
SELECT worker.WorkerID, worker.fullname, job.JobCode, job.jobName, Count(slottime.FK_Hour) AS NUMBER_OF_HOURS_WORKED
FROM (
(
(job INNER JOIN slot
ON job.JobCode = slot.fk_JobCode
)
INNER JOIN (worker INNER JOIN slotworker ON worker.WorkerID = slotworker.FK_worker)
ON slot.SlotNo = slotworker.FK_SlotNo)
INNER JOIN slottime ON slot.SlotNo = slottime.FK_SlotNo
)
LEFT JOIN manager ON (job.JobCode = manager.FK_JobCode) AND (worker.WorkerID = manager.FK_WorkerID) GROUP BY worker.WorkerID, worker.fullname, job.JobCode, job.jobName, manager.is_the_boss
However, not all workers are equal. Workers who are allocated as managers are paid an additional 2 hours per job.
the manager table is structured as JobCode, WorkerID, is_the_boss
is_the_boss simply records '1' in the event that that worker is allocated the manager position of that particular job.
How would I affect the count of slottime.FK_Hour such that an additional 2 hours are added for each of the jobs where (CASE WHEN is_the_boss = 1) is true?
Upvotes: 0
Views: 66
Reputation: 1057
Try below one
SELECT worker.WorkerID, worker.fullname, job.JobCode, job.jobName, Case When manager.is_the_boss = 1 Then Count(slottime.FK_Hour) + 2 Else Count(slottime.FK_hour End AS NUMBER_OF_HOURS_WORKED
FROM job
INNER JOIN slot ON job.JobCode = slot.fk_JobCode
INNER JOIN slotworker ON slot.SlotNo = slotworker.FK_SlotNo
INNER JOIN worker ON worker.WorkerID = slotworker.FK_worker
INNER JOIN slottime ON slot.SlotNo = slottime.FK_SlotNo
LEFT JOIN manager ON (job.JobCode = manager.FK_JobCode) AND (worker.WorkerID = manager.FK_WorkerID)
GROUP BY worker.WorkerID, worker.fullname, job.JobCode, job.jobName, manager.is_the_boss
Upvotes: 0
Reputation: 1269623
Your query is rather hard to follow. Why have all those parentheses in the from
clause (unless you are using MS Access and you have no choice)? It is simpler to just list the tables with the join
criteria.
Solving your problem requires counting the number of job codes where the worker is the boss. You can do this with a conditional count(distinct)
:
SELECT w.WorkerID, w.fullname, j.JobCode, j.jobName,
Count(st.FK_Hour) AS NUMBER_OF_HOURS_WORKED,
count(distinct case when m.is_the_boss then j.jobCode end) * 2 as ManagerHoursWorks
FROM job j INNER JOIN
slot s
ON j.JobCode = s.fk_JobCode INNER JOIN
slotworker sw
ON slot.SlotNo = sw.FK_SlotNo INNER JOIN
worker w
ON w.WorkerID = sw.FK_worker INNER JOIN
slottime st
ON s.SlotNo = st.FK_SlotNo LEFT JOIN
manager m
ON j.JobCode = m.FK_JobCode AND w.WorkerID = m.FK_WorkerID
GROUP BY w.WorkerID, w.fullname, j.JobCode, j.jobName;
Upvotes: 1
Reputation: 3591
Try this below
SELECT worker.WorkerID, worker.fullname, job.JobCode, job.jobName, Case When manager.is_the_boss = 1 Then Count(slottime.FK_Hour) + 2 Else Count(slottime.FK_hour End AS NUMBER_OF_HOURS_WORKED
FROM (
(
(job INNER JOIN slot
ON job.JobCode = slot.fk_JobCode
)
INNER JOIN (worker INNER JOIN slotworker ON worker.WorkerID = slotworker.FK_worker)
ON slot.SlotNo = slotworker.FK_SlotNo)
INNER JOIN slottime ON slot.SlotNo = slottime.FK_SlotNo
)
LEFT JOIN manager ON (job.JobCode = manager.FK_JobCode) AND (worker.WorkerID = manager.FK_WorkerID) GROUP BY worker.WorkerID, worker.fullname, job.JobCode, job.jobName, manager.is_the_bos
Upvotes: 1