Stumbler
Stumbler

Reputation: 2146

MySQL: Add to Count with case... then

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

Answers (3)

Indra Prakash Tiwari
Indra Prakash Tiwari

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

Gordon Linoff
Gordon Linoff

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

DevelopmentIsMyPassion
DevelopmentIsMyPassion

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

Related Questions