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 的结构为 JobCode、WorkerID、is_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
我有一个 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 的结构为 JobCode、WorkerID、is_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