MySQL:用大小写加到计数...然后

MySQL: Add to Count with case... then

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

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 小时。

经理 table 的结构为 JobCodeWorkerIDis_the_boss

is_the_boss 如果该工人被分配了该特定工作的经理职位,则只记录“1”。

我将如何影响 slottime.FK_Hour 的计数,以便为每个 (CASE WHEN is_the_boss = 1) 为真的作业增加 2 小时?

试试下面这个

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

您的查询很难理解。为什么要在 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;

试试下面一个

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