1

私は3つのテーブルを持っていますmanageriDを使用して特定の日付範囲のすべての従業員を欠席させる方法

1)日付のルックアップテーブル(全月のルックアップテーブル)*/例

╔════════════╗
║    DATE    ║
╠════════════╣
║ 2013-01-01 ║
║ 2013-01-02 ║
║ 2013-01-03 ║
╚════════════╝

次のような列がある2番目の従業員テーブル(マネージャーIDを持つすべての従業員の従業員テーブル)

╔════════════╦══════════╦════════╦══════════╦═══════╦═══════════╗
║ EMPLOYEEID ║ BRANCHID ║ DEPTID ║ DESIGNID ║ NAME  ║ MANAGERID ║
╠════════════╬══════════╬════════╬══════════╬═══════╬═══════════╣
║          1 ║        1 ║     10 ║        5 ║ A     ║        15 ║
║          2 ║        2 ║     10 ║        5 ║ AB    ║        18 ║
║          3 ║        1 ║     10 ║        5 ║ ABC   ║        15 ║
║          5 ║        1 ║     10 ║        5 ║ ABCD  ║        15 ║
║          9 ║        2 ║     10 ║        5 ║ AEFG  ║        16 ║
║         12 ║        1 ║     10 ║        5 ║ AHIJ  ║        15 ║
║          8 ║        1 ║     10 ║        5 ║ AKLMN ║        18 ║
╚════════════╩══════════╩════════╩══════════╩═══════╩═══════════╝ 

3 番目のテーブルは、ログインとアウトのテーブル (全従業員のログインとログアウト) です。

╔════════════╦══════════╦═════════════════════╦═════════════╗
║ EMPLOYEEID ║ BRANCHID ║    CHECKLOGSDATE    ║ CHECKINTYPE ║
╠════════════╬══════════╬═════════════════════╬═════════════╣
║          1 ║        1 ║ 2013-01-01 09:12:15 ║ in          ║
║          1 ║        2 ║ 2013-01-01 19:24:15 ║ out         ║
║          2 ║        1 ║ 2013-01-01 10:20:15 ║ in          ║
║          2 ║        1 ║ 2013-01-01 18:24:15 ║ out         ║
║          3 ║        2 ║ 2013-01-01 09:12:15 ║ in          ║
║          3 ║        1 ║ 2013-01-01 16:24:15 ║ out         ║
║          4 ║        1 ║ 2013-01-01 09:32:15 ║ in          ║
╚════════════╩══════════╩═════════════════════╩═════════════╝

SQLFiddle デモ

4

2 に答える 2

1

あなたの質問からは、従業員が特定の日に欠勤したことを伝える規則が何であるかが不明です. ログに(インまたはアウトの)レコードがないだけの場合は、試すことができます

更新しました

SELECT d.date, e.employeeid, e.name
  FROM lookup d CROSS JOIN employee e LEFT JOIN log l 
    ON d.date = DATE(l.Checklogsdate)
   AND e.employeeid = l.employeeid   
 WHERE e.managerid = 15  
   AND d.date BETWEEN '2013-01-01' AND '2013-01-02'
   AND l.employeeid IS NULL
 GROUP BY d.date, e.employeeid, e.name 

これがSQLFiddle のデモです。

オリジナル

SELECT e1.date, e1.employeeid, e1.name
  FROM
(
 SELECT d.date, e.employeeid, e.name
   FROM lookup d CROSS JOIN employee e
   WHERE managerid = 15  
     AND d.date BETWEEN '2013-01-01' AND '2013-01-02'
) e1 LEFT JOIN
(
 SELECT l.employeeid, DATE(MIN(l.Checklogsdate)) date
   FROM log l JOIN employee e 
     ON l.employeeid = e.employeeid
    AND e.managerid = 15  
  GROUP BY l.employeeid, DATE(l.Checklogsdate)
) l1
    ON e1.date = l1.date
   AND e1.employeeid = l1.employeeid 
 WHERE l1.employeeid IS NULL
 ORDER BY e1.date, e1.employeeid

出力例:

|             DATE | EMPLOYEEID | NAME |
----------------------------------------
| January, 01 2013 |          5 | ABCD |
| January, 01 2013 |         12 | AHIJ |
| January, 02 2013 |          1 |    A |
| January, 02 2013 |          3 |  ABC |
| January, 02 2013 |          5 | ABCD |
| January, 02 2013 |         12 | AHIJ |

これがSQLFiddle のデモです。

于 2013-06-03T08:55:45.117 に答える
0
SELECT e.Name
FROM Employee e
WHERE e.ManagerId = 15
AND e.Name NOT IN
(
    SELECT DISTINCT e.Name
    FROM Log l
    INNER JOIN Employee e ON l.EmployeeId = e.EmployeeId
    WHERE e.ManagerId = 15
)

こちら15がご希望の番号に置き換えられます

SQL フィドルのデモ

于 2013-06-03T08:39:34.290 に答える