Sql 如何找出同一部门不同班次的员工
我有一个表employee,它具有不同的属性,如emp_code、naeme、…、deptt。 还有另一个名为nightShift的表,它有字段——emp_代码、shift_时间。 任何不在夜班表中的员工将自动假定为在白班 现在我必须找出那些德普特公司的员工,他们中有些人上夜班,有些人上正常班 什么可以是对此的查询 范例Sql 如何找出同一部门不同班次的员工,sql,informix,Sql,Informix,我有一个表employee,它具有不同的属性,如emp_code、naeme、…、deptt。 还有另一个名为nightShift的表,它有字段——emp_代码、shift_时间。 任何不在夜班表中的员工将自动假定为在白班 现在我必须找出那些德普特公司的员工,他们中有些人上夜班,有些人上正常班 什么可以是对此的查询 范例 **Employees** ---------------------------------------- emp_code| Name | deptt ---
**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)都在夜班,没有人在正常轮班
有人能帮我吗?这里有一个按版本分组的列表-以左键连接两个表,并计算每个部门的夜班数。若计数大于零但不等于部门中所有员工的计数,则我们有一个匹配项
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)
选择employees.deptt
来自员工
左接夜班
on employees.emp_code=nightShift.emp_code
按雇员分组。deptt
计数(夜班电磁脉冲代码)>0
和计数(员工.emp_代码)计数(夜班.emp_代码)
.这里是一个按版本分组的组-以左连接方式连接两个表,并计算每个部门的夜班数。若计数大于零但不等于部门中所有员工的计数,则我们有一个匹配项
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)
选择employees.deptt
来自员工
左接夜班
on employees.emp_code=nightShift.emp_code
按雇员分组。deptt
计数(夜班电磁脉冲代码)>0
和计数(员工.emp_代码)计数(夜班.emp_代码)
.你可以试试这些方法
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设施工作的地方,您可以尝试以下方法
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设施工作的地方我认为您需要计算每个部门的夜班工人数量,以及每个部门的白班工人数量,你关心的是那些两个数字都大于零的部门 第1阶段:每个部门的夜班工人:
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
第2阶段:每个部门的白班工人
为此有各种可能的策略。一种是计算每个部门的员工总数,然后减去夜班员工人数:
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版本(目前都支持)都应该处理这些查询
你可能可以按照的答案来简化这个问题。我认为你需要计算每个部门的夜班工人数量,以及每个部门的白班工人数量,你关心的是两个数字都大于零的部门 第1阶段:每个部门的夜班工人:
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
第2阶段:每个部门的白班工人
为此有各种可能的策略。一种是计算每个部门的员工总数,然后减去夜班员工人数:
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版本(目前都支持)都应该处理这些查询
您可能可以按照您的回答来简化这一点。假设一个部门有4名员工,其中2名员工上白班,2名员工上夜班。您不会选择那个部门,因为第二个HAVING子句条件中的两个计数相等。@JonathanLeffler不正确。count(employees.emp_code)返回部门中的员工总数,无论他们在哪个班次工作。好的-它必须超过我的就寝时间或其他时间。“我错了!”尼古拉,乔纳森还没来得及测试这些。尽管如此,还是有很多人感谢你把宝贵的时间花在这上面。假设一个部门有4名员工,其中2人上白班,2人上夜班。您不会选择那个部门,因为第二个HAVING子句条件中的两个计数相等。@JonathanLeffler不正确。count(employees.emp_code)返回部门中的员工总数,无论他们在哪个班次工作。好的-它必须超过我的就寝时间或其他时间。“我错了!”尼古拉,乔纳森还没来得及测试这些。不过,还是要感谢你把宝贵的时间花在这上面。