2015-10-07 4 views
0

У меня есть SQL-запрос, который работает прекрасно, чтобы вернуть количество часов работник работает в какой-либо конкретной работеMySQL: Добавить к графе с футляром ... тогда

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 

Однако не все работники равны. Рабочим, которые распределяются как управляющие, оплачивается дополнительно 2 часа на работу.

таблица менеджер структурирована JobCode, WorkerID, is_the_boss

is_the_boss просто записывает '1' в том случае, что работник выделяется должность менеджера этой конкретной работы.

Как повлиять на количество slottime.FK_Hour, чтобы добавить дополнительные 2 часа для каждого из заданий, где (CASE WHEN is_the_boss = 1) истинно?

+0

примечание стороны, Вы не должны использовать 'SUM' вместо' Count', чтобы получить общее количество часов для каждого из них? –

ответ

1

Попробуйте ниже

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 
1

Ваш запрос довольно трудно следовать. Почему все те круглые скобки в предложении from (если вы не используете MS Access и у вас нет выбора)? Проще просто перечислить таблицы с критериями join.

Решение вашей проблемы требует подсчета количества кодов заданий, где рабочий является начальником. Вы можете сделать это с помощью условного 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; 
0

Try ниже один

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 
Смежные вопросы