我如何计算使用这三个表的总天数,缺席和使用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
答案 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
我建议您删除scheddate
,datefrom
和dateto
列,如果您确实需要摘要,或者包含处理days
的日期,{{1 }}和absent
列作为标记。
鉴于实际需求的不确定性,这里是查询这些列是否被视为标志。它还可以简化为具有“状态”的状态。列而不是使用单个case语句的三列。
如果需要实际摘要,您可以调整此查询以获取其他结果。
late