MySQL:用case添加到Count ...然后

时间:2015-10-07 11:25:45

标签: mysql sql count case

我有一个sql查询,它可以完美地返回工作人员在任何特定工作中工作的小时数

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的计数,以便为每个(CASE WHEN is_the_boss = 1)的作业添加额外的2小时?

3 个答案:

答案 0 :(得分: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 :(得分: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;

答案 2 :(得分:0)

尝试以下

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