计算天数,缺席和迟到使用SQL语句

时间:2015-08-19 23:24:00

标签: mysql sql jointable

我如何计算使用这三个表的总天数,缺席和使用sql语句的总数,我正在尝试使用MySQL中的JOIN语句将它们组合起来以获取渲染的天数,缺席次数,数量很晚了,但是没有用。我想要的输出是这样的

Fullname  |  SchedDate  |   DateFrom    |   DateTO   |   Days   |   Absents   |   Late  

以下是我的表格

Employees

empid | fullname |  logs_id
10001 | Emman    |  000001       
10002 | Paul     |  000002       
10003 | Jose     |  000003       
10004 | Mike     |  000004       
10005 | John     |  000005

“scheddate”是员工的分配时间表,而“DateFrom”和“DateTo”是员工的时间表。我添加了scheddate因为员工可以安排GraveYard班次。     Scheddate

empid |  Scheddate  |     DateFrom          |        DateTo      
10001 |  2015-08-01 |  2015-08-01 08:00:00  |    2015-08-01 17:00:00                 
10001 |  2015-08-02 |  2015-08-02 08:00:00  |    2015-08-02 17:00:00                 
10001 |  Day Off    |  2015-08-01 08:00:00  |    2015-08-01 17:00:00                  
10001 |  2015-08-04 |  2015-08-04 08:00:00  |    2015-08-04 17:00:00                 
10002 |  2015-08-01 |  2015-08-01 08:00:00  |    2015-08-01 17:00:00                    
10002 |  2015-08-02 |  2015-08-02 08:00:00  |    2015-08-02 17:00:00                   
10002 |  2015-08-03 |  2015-08-03 08:00:00  |    2015-08-03 17:00:00                      
10002 |  2015-08-04 |  2015-08-04 08:00:00  |    2015-08-04 17:00:00                       
10003 |  2015-08-01 |  2015-08-01 08:00:00  |    2015-08-01 17:00:00                       
10003 |  2015-08-02 |  2015-08-02 08:00:00  |    2015-08-02 17:00:00                 
10004 |  2015-08-03 |  2015-08-03 08:00:00  |    2015-08-03 17:00:00                 
10004 |  2015-08-04 |  2015-08-04 08:00:00  |    2015-08-04 17:00:00                   
10004 |  2015-08-05 |  2015-08-05 08:00:00  |    2015-08-05 17:00:00                 
10005 |  2015-08-01 |  2015-08-01 08:00:00  |    2015-08-01 17:00:00                 
10005 |  Day Off    |  2015-08-01 08:00:00  |    2015-08-01 17:00:00                     
10005 |  2015-08-02 |  2015-08-01 08:00:00  |    2015-08-01 17:00:00 

“type”列表示登录和注销,其中“0”是登录名,“1”是登出名。 “datetime”当然是员工的日志。     日志

logs_id   |   type   |  datetime
000001    |     0    |  2015-08-01 08:00:00 
000001    |     1    |  2015-08-01 17:00:00  
000001    |     0    |  2015-08-01 08:00:00 
000001    |     1    |  2015-08-01 17:00:00 
000002    |     0    |  2015-08-01 08:00:00  
000002    |     1    |  2015-08-01 17:00:00 
000002    |     0    |  2015-08-01 08:00:00 
000002    |     1    |  2015-08-01 17:00:00 
000003    |     0    |  2015-08-01 08:00:00 
000003    |     1    |  2015-08-01 17:00:00 
000003    |     0    |  2015-08-01 08:00:00 
000003    |     1    |  2015-08-01 17:00:00 

这是我到目前为止尝试的SQL,但它失败了。我仍然是SQL Join的新手,这是我迄今为止尝试的基于我在网上阅读的所有内容。我希望有人可以帮助我。

  SELECT e.Fullname, e.fp_id, e.empid s.scheddate, s.datefrom, s.dateto,s.empid,
     COUNT(scheddate) as Day
     SUM(CASE WHEN ((f.datetime between s.datefrom and s.dateto) IS NOT NULL) as Absent,
     SUM(Case /* Something goes here*/) as Late
     FROM employees e 
     LEFT OUTER JOIN schedules s ON e.id = s.empid AND ((date(s.scheddate) between '2015-08-01' AND '2015-08-05') OR s.scheddate is NULL) 
     LEFT OUTER JOIN logs f ON e.fp_id = f.fp_id AND f.datetime is NULL 
     ORDER BY `Fullname` ASC

1 个答案:

答案 0 :(得分:0)

首先;在发布此类问题时,请为相关表格提供DDL并提供有效的样本数据。更好的是包括sql fiddle。此外,当包含所需结果时,显示结果而不仅仅是查询列。

话虽如此,我认为您所说的内容与预期的查询结果之间存在一些混淆。鉴于数据集结果,您知道什么?有一天Emman准时,有一天缺席,有一天迟到。不太有用......

empid   fullname    scheddate                   datefrom                    dateto                      days    absent  late
10001   Emman       August, 01 2015 00:00:00    August, 01 2015 08:00:00    August, 01 2015 17:00:00    1       1       1
10001   Emman       August, 02 2015 00:00:00    August, 02 2015 08:00:00    August, 02 2015 17:00:00    1       1       1
10001   Emman       August, 04 2015 00:00:00    August, 04 2015 08:00:00    August, 04 2015 17:00:00    1       1       1

我建议您删除scheddatedatefromdateto列,如果您确实需要摘要,或者包含处理days的日期,{{1 }}和absent列作为标记。

鉴于实际需求的不确定性,这里是查询这些列是否被视为标志。它还可以简化为具有“状态”的状态。列而不是使用单个case语句的三列。

如果需要实际摘要,您可以调整此查询以获取其他结果。

late