1

emp_code、naeme、...、deptt などのさまざまな属性を持つテーブル従業員があります。フィールドemp_code、shift_timeを持つnightShiftと呼ばれる別のテーブルがあります。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

出力では、従業員の一部が夜勤 (e1、e2、e5) で、一部が通常のシフト (e6、e10) であるため、Deptt Ops のみが必要です。出力には、すべての従業員 (e3、e8 ,e9) は通常勤務で、夜勤はなし。すべての従業員 (e4、e7) は夜勤であり、通常のシフトではいないため、出力には施設が含まれていないはずです。

誰かがこれで私を助けることができますか?

4

3 に答える 3

1

これはバージョンごとのグループです - 左結合で両方のテーブルを結合し、部門ごとに nightShifts をカウントします。count が 0 より大きいが、部門内の全従業員の 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)

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

各部門の夜勤労働者の数と、各部門の日勤労働者の数を数える必要があると思いますが、両方の数がゼロより大きい部門に関心があります。

ステージ 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: 部門ごとの日勤労働者数

これにはさまざまな戦略が考えられます。1 つは、各部門の従業員の総数を数え、夜勤の従業員の数を差し引く方法です。

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 に答える