1

我有一个表员工,它具有不同的属性,如 emp_code、naeme、....、deptt。还有一个名为 nightShift 的表,其中包含字段 emp_code、shift_time。任何不在夜班表中的员工都被自动假定为白班。

现在我必须找出那些有一些员工在夜班工作而一些在正常班次工作的部门,这有什么可以查询的。

例子

**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) 输出不应包含所有员工 (e3,e8) ,e9) 正常值班,夜班无。输出不应包含设施,因为所有员工(e4、e7)都在夜班,没有人在正常班。

有人可以帮我吗?

4

3 回答 3

1

这是按版本分组的 - 在左连接中加入两个表并计算每个部门的夜班。如果计数大于零但不等于部门中所有工人的计数,我们就有匹配项。

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)

在 Sql Fiddle 上进行测试

于 2012-04-19T13:17:46.263 回答
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')

内部连接将消除每个不上夜班的人,然后在我们发现任何结果在部门设施中不起作用的地方

于 2012-04-19T13:22:27.873 回答
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

第 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 版本(目前都支持)都应该处理这些查询。

您可能可以按照Nikola Markovinović的回答简化这一点。

于 2012-04-20T09:46:57.300 回答