我有一个表员工,它有不同的属性,如emp_code,naeme,....,deptt。 还有另一个名为nightShift的表,它有fields-emp_code,shift_time。 任何不在nightShift表中的员工都会自动被假定为白班。
现在我必须找出那些有一些员工在夜班工作而有些员工在正常轮班工作的部门 什么可以查询。
实施例
**Employees**
----------------------------------------
emp_code| Name | deptt
----------------------------------------
e1 John Ops
e2 Martin Ops
e3 Gary Infra
e4 John Facilities
e5 Michael Ops
e6 Alan Ops
e7 Tony Facilites
e8 Alex Infra
e9 Peter Infra
e10 Ron Ops
**nightShift**
----------------------------------------
emp_code | shift_time
----------------------------------------
e1 shiftA
e2 shiftA
e5 shiftB
e4 shiftB
e7 shiftC
现在在输出中,我只想要Deptt Ops,因为它的一些员工是夜班(e1,e2,e5),有些是正常班次(e6,e10) 输出不应包含Infra,因为所有员工(e3,e8,e9)都处于正常班次,夜班没有。 输出不应包含设施,因为所有员工(e4,e7)都处于夜班,而正常班次则没有。
有人可以帮我吗?
答案 0 :(得分:1)
以下是按版本分组 - 在左连接中加入两个表并计算每个部门的nightShifts。如果count大于零但不等于部门中所有工人的数量,我们就匹配了。
select employees.deptt
from employees
left join nightShift
on employees.emp_code = nightShift.emp_code
group by employees.deptt
having count (nightShift.emp_code) > 0
and count (employees.emp_code) <> count (nightShift.emp_code)
答案 1 :(得分:0)
你可以尝试这些方面的东西
select
distinct e.deptt
from
Employees e
inner join
NightShift n
on
n.emp_code = e.emp_code
Where
e.deptt not in ('Facilities', 'Facilites')
内部联接将消除所有不在夜班工作的人,然后在我们发现任何不在deptt设施中工作的地方
答案 2 :(得分:0)
我认为您需要计算每个部门的夜班工人数量,以及每个部门的轮班工人数量,并且您关注的是两个计数都大于零的部门。
第一阶段:每个部门的夜班工人:
SELECT e.deptt, COUNT(*) AS headcount
FROM Employees AS e
JOIN NightShift AS n
ON n.emp_code = e.emp_code
GROUP BY e.deptt
第二阶段:每个部门的日班工人
有各种可能的策略。一个是计算每个部门的总工人数量并减去夜班工人的数量:
SELECT d.deptt, (d.headcount - n.headcount) AS headcount
FROM (SELECT e2.deptt, COUNT(*) AS headcount
FROM Employees AS e2
GROUP BY e2.deptt
) AS d
JOIN (SELECT e.deptt, COUNT(*) AS headcount
FROM Employees AS e
JOIN NightShift AS n
ON n.emp_code = e.emp_code
GROUP BY e.deptt
) AS n
ON d.deptt = e.deptt
阶段3:挑选那些日班和夜班人员都不为零的部门:
SELECT d.deptt, (d.headcount - n.headcount) AS dayshift, n.headcount AS nightshift
FROM (SELECT e2.deptt, COUNT(*) AS headcount
FROM Employees AS e2
GROUP BY e2.deptt
) AS d
JOIN (SELECT e.deptt, COUNT(*) AS headcount
FROM Employees AS e
JOIN NightShift AS n
ON n.emp_code = e.emp_code
GROUP BY e.deptt
) AS n
ON d.deptt = e.deptt
WHERE d.headcount > 0
AND n.headcount > 0
可能有一个更简洁的表述,但我相当肯定这会得到正确答案。
请注意,这不是实际的SQL DBMS附近,因此可能存在一些语法错误。
我还假设您正在使用受支持的Informix版本(而不是Informix OnLine或Informix SE)。一些旧版本的Informix不支持所有这些语法,但我相信所有11.x版本(目前都支持)都应该处理这些查询。
你可以按照Nikola Markovinović的答案来简化这一点。