Sql 如何找出同一部门不同班次的员工

Sql 如何找出同一部门不同班次的员工,sql,informix,Sql,Informix,我有一个表employee,它具有不同的属性,如emp_code、naeme、…、deptt。 还有另一个名为nightShift的表,它有字段——emp_代码、shift_时间。 任何不在夜班表中的员工将自动假定为在白班 现在我必须找出那些德普特公司的员工,他们中有些人上夜班,有些人上正常班 什么可以是对此的查询 范例 **Employees** ---------------------------------------- emp_code| Name | deptt ---

我有一个表employee,它具有不同的属性,如emp_code、naeme、…、deptt。 还有另一个名为nightShift的表,它有字段——emp_代码、shift_时间。 任何不在夜班表中的员工将自动假定为在白班

现在我必须找出那些德普特公司的员工,他们中有些人上夜班,有些人上正常班 什么可以是对此的查询

范例

**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)返回部门中的员工总数,无论他们在哪个班次工作。好的-它必须超过我的就寝时间或其他时间。“我错了!”尼古拉,乔纳森还没来得及测试这些。不过,还是要感谢你把宝贵的时间花在这上面。