简体   繁体   English

MySQL:加大小写…然后

[英]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 我有一个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

However, not all workers are equal. 但是,并非所有工人都是平等的。 Workers who are allocated as managers are paid an additional 2 hours per job. 被分配为经理的工人每份工作将获得2个小时的额外工资。

the manager table is structured as JobCode , WorkerID , is_the_boss manager表的结构为JobCodeWorkerIDis_the_boss

is_the_boss simply records '1' in the event that that worker is allocated the manager position of that particular job. 如果为该工作人员分配了该特定工作的经理职位,则is_the_boss仅记录“ 1”。

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? 我将如何影响slottime.FK_Hour的计数,以便为(CASE WHEN is_the_boss = 1)为true的每个作业添加额外的2小时?

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

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)? 为什么在from子句中包含所有这些括号(除非您正在使用MS Access,并且别无选择)? It is simpler to just list the tables with the join criteria. 仅列出带有join条件的表会更简单。

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) : 您可以使用条件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;

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM