【问题标题】:How to find out employees having same department but different shifts如何找出具有相同部门但不同班次的员工
【发布时间】:2012-04-20 17:46:57
【问题描述】:

我有一个表员工,它具有不同的属性,如 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) 输出不应包含 Infra,因为所有员工(e3、e8、e9)都在正常值班,而没有夜班。 输出不应包含设施,因为所有员工 (e4,e7) 都在夜班,没有人在正常值班。

有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: sql informix


    【解决方案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)
    

    Test it on Sql Fiddle.

    【讨论】:

    • 假设一个部门有 4 名员工,其中 2 人上白班,2 人上夜班。您不会选择该部门,因为第二个 HAVING 子句条件中的两个计数相等。
    • @JonathanLeffler 不正确。 count (employees.emp_code) 返回部门中员工的总数,无论他们在哪个班次工作。
    • 好的 - 它一定是过了我的就寝时间之类的。我的错。
    • @Nikola,Jonathan 还没有时间测试这些。但是,非常感谢您投入宝贵的时间。
    【解决方案2】:

    你可以尝试这些方法

    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')
    

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

    【讨论】:

      【解决方案3】:

      我认为您需要计算每个部门的夜班工人数量和每个部门的白班工人数量,并且您关心的是两个计数都大于零的那些部门。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-09
        • 2018-06-21
        • 1970-01-01
        • 1970-01-01
        • 2021-08-22
        • 2020-05-12
        • 1970-01-01
        相关资源
        最近更新 更多