我有一个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小时?
答案 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