2012-04-19 66 views
1

我有一個具有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行動,作爲其部分員工是夜班(E1,E2,E5)以及一些在正常換檔(E6,E10) 輸出不應該包含Infra,因爲所有員工(e3,e8,e9)都處於正常班次,並且沒有夜班。 輸出不應該包含設施,因爲所有員工(e4,e7)都在夜班,沒有正常班次。

有人可以幫助我嗎?

回答

1

這裏是一個按版本分組 - 加入兩個表在左連接和每個部門計數nightShifts。如果計數大於零但不等於部門中所有工作人員的人數,我們有一個匹配。

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

+0

假設一個部門有4名員工,其中2名上班,2名夜班。您不會選擇該部門,因爲第二個HAVING子句條件中的兩個計數將相等。 – 2012-04-20 09:32:09

+0

@JonathanLeffler不正確。 count(employees.emp_code)返回部門中的員工總數,無論他們在哪裏工作。 – 2012-04-20 09:39:48

+0

好的 - 它必須超過我的睡前時間或某事。我的錯。 – 2012-04-20 09:45:31

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設施不工作的任何結果

+0

謝謝。將盡快嘗試並更新您的全部。 – user1314305 2012-04-20 19:11:03

0

我想你需要的東西統計每個部門的夜班工作人員的人數,以及每個部門的白班工作人員的人數,並且你關心的是那些兩個人數都大於零的部門。

第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:每個部門白班工人

這有各種可能的策略。其一是計算職工總數爲每個部門覈減夜班工人的數量:其中在dayshift和夜班的員工人數都非零挑選那些部門:

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 

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階段

可能有一個更簡潔的公式,但我相當肯定這會給出正確的答案。

需要注意的是,這並沒有在實際的SQL DBMS附近出現,所以可能會出現一些語法錯誤。

我還假設您使用的是Informix(而不是Informix OnLine或Informix SE)的受支持版本。一些舊版本的Informix不支持所有這些語法,但我相信所有的11。x版本(目前全部支持)都應該處理這些查詢。

你或許可以簡化這個沿着Nikola Markovinović的答案。

相關問題