如何找出具有相同部门但轮班不同的员工

时间:2012-04-19 12:46:36

标签: sql informix

我有一个表员工,它有不同的属性,如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)都处于夜班,而正常班次则没有。

有人可以帮我吗?

3 个答案:

答案 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)

Test it on Sql Fiddle

答案 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ć的答案来简化这一点。