Sql 查询创建带时差的考勤报表
Sql Query To Create Attendance Report WIth Time Difference
我正在处理应反映以下输出的出勤报告 - 员工准时和迟到的计数:
Department - OnTime - Late - Late_1_To_10_Mins
1 - 2 - 1 - 1
2 - 2 - 1 - 1
现在,我使用了以下几乎可以正常工作但重复数据的查询:
SELECT DISTINCT Department,
CASE WHEN
CONVERT(VARCHAR(5), InTime, 108) = '10:00' THEN
(SELECT COUNT(PersonID) FROM Persons WHERE
CONVERT(VARCHAR(5), InTime, 108) = '10:00') ELSE 0 END AS OnTime,
CASE WHEN
CONVERT(VARCHAR(5), InTime, 108) > '10:00' THEN
(SELECT COUNT(PersonID) FROM Persons WHERE
CONVERT(VARCHAR(5), InTime, 108) > '10:00') ELSE 0 END AS Late
FROM Persons
输出如下:
Department - OnTime - Late
1 - 0 - 2
1 - 4 - 0
2 - 0 - 2
2 - 4 - 0
注意:我不确定如何获取延迟 1 到 10 分钟之间的数据并从 InTime
列中弄清楚 table。上面的查询至少应该让我适当地找到 OnTime
和 Late
数据,但似乎遗漏了一些东西。以下是 table 结构及其示例数据:
CREATE TABLE [Persons] (
[PersonID] [int] NULL ,
[InTime] [datetime] NULL ,
[OutTime] [datetime] NULL ,
[Department] [int] NULL
) ON [PRIMARY]
GO
INSERT INTO Persons(PersonID, InTime, OutTime, Department)VALUES (1001, '2017-03-02 10:00:11.297', '2017-03-02 06:00:11.293', 1)
INSERT INTO Persons(PersonID, InTime, OutTime, Department)VALUES (1002, ' 2017-03-02 10:00:08.180', ' 2017-03-02 06:00:10.293', 1)
INSERT INTO Persons(PersonID, InTime, OutTime, Department)VALUES (1003, ' 2017-03-02 10:01:08.240', ' 2017-03-02 06:00:12.220', 1)
INSERT INTO Persons(PersonID, InTime, OutTime, Department)VALUES (1004, ' 2017-03-02 10:02:20.200', ' 2017-03-02 06:00:20.200', 2)
INSERT INTO Persons(PersonID, InTime, OutTime, Department)VALUES (1005, ' 2017-03-02 10:02:20.240', ' 2017-03-02 06:00:22.200', 2)
INSERT INTO Persons(PersonID, InTime, OutTime, Department)VALUES (1006, ' 2017-03-02 10:04:20.100', ' 2017-03-02 06:00:20.320', 2)
对于使用条件聚合的给定示例数据:
select
department
, OnTime = sum(case when convert(time,InTime) < '10:01:00' then 1 else 0 end)
, Late = sum(case when convert(time,InTime) >= '10:01:00' then 1 else 0 end)
, Late_1_To_10_Mins = sum(case
when convert(time,InTime) >= '10:01:00'
and convert(time,InTime) < '10:11:00'
then 1 else 0 end)
from persons
group by department
returns:
+------------+--------+------+--------------+
| department | OnTime | Late | Late_10_Mins |
+------------+--------+------+--------------+
| 1 | 2 | 1 | 1 |
| 2 | 0 | 3 | 3 |
+------------+--------+------+--------------+
我正在处理应反映以下输出的出勤报告 - 员工准时和迟到的计数:
Department - OnTime - Late - Late_1_To_10_Mins
1 - 2 - 1 - 1
2 - 2 - 1 - 1
现在,我使用了以下几乎可以正常工作但重复数据的查询:
SELECT DISTINCT Department,
CASE WHEN
CONVERT(VARCHAR(5), InTime, 108) = '10:00' THEN
(SELECT COUNT(PersonID) FROM Persons WHERE
CONVERT(VARCHAR(5), InTime, 108) = '10:00') ELSE 0 END AS OnTime,
CASE WHEN
CONVERT(VARCHAR(5), InTime, 108) > '10:00' THEN
(SELECT COUNT(PersonID) FROM Persons WHERE
CONVERT(VARCHAR(5), InTime, 108) > '10:00') ELSE 0 END AS Late
FROM Persons
输出如下:
Department - OnTime - Late
1 - 0 - 2
1 - 4 - 0
2 - 0 - 2
2 - 4 - 0
注意:我不确定如何获取延迟 1 到 10 分钟之间的数据并从 InTime
列中弄清楚 table。上面的查询至少应该让我适当地找到 OnTime
和 Late
数据,但似乎遗漏了一些东西。以下是 table 结构及其示例数据:
CREATE TABLE [Persons] (
[PersonID] [int] NULL ,
[InTime] [datetime] NULL ,
[OutTime] [datetime] NULL ,
[Department] [int] NULL
) ON [PRIMARY]
GO
INSERT INTO Persons(PersonID, InTime, OutTime, Department)VALUES (1001, '2017-03-02 10:00:11.297', '2017-03-02 06:00:11.293', 1)
INSERT INTO Persons(PersonID, InTime, OutTime, Department)VALUES (1002, ' 2017-03-02 10:00:08.180', ' 2017-03-02 06:00:10.293', 1)
INSERT INTO Persons(PersonID, InTime, OutTime, Department)VALUES (1003, ' 2017-03-02 10:01:08.240', ' 2017-03-02 06:00:12.220', 1)
INSERT INTO Persons(PersonID, InTime, OutTime, Department)VALUES (1004, ' 2017-03-02 10:02:20.200', ' 2017-03-02 06:00:20.200', 2)
INSERT INTO Persons(PersonID, InTime, OutTime, Department)VALUES (1005, ' 2017-03-02 10:02:20.240', ' 2017-03-02 06:00:22.200', 2)
INSERT INTO Persons(PersonID, InTime, OutTime, Department)VALUES (1006, ' 2017-03-02 10:04:20.100', ' 2017-03-02 06:00:20.320', 2)
对于使用条件聚合的给定示例数据:
select
department
, OnTime = sum(case when convert(time,InTime) < '10:01:00' then 1 else 0 end)
, Late = sum(case when convert(time,InTime) >= '10:01:00' then 1 else 0 end)
, Late_1_To_10_Mins = sum(case
when convert(time,InTime) >= '10:01:00'
and convert(time,InTime) < '10:11:00'
then 1 else 0 end)
from persons
group by department
returns:
+------------+--------+------+--------------+
| department | OnTime | Late | Late_10_Mins |
+------------+--------+------+--------------+
| 1 | 2 | 1 | 1 |
| 2 | 0 | 3 | 3 |
+------------+--------+------+--------------+