Sql server 2008 Sql查询创建带时差的考勤报告

Sql server 2008 Sql查询创建带时差的考勤报告,sql-server-2008,report,Sql Server 2008,Report,我正在处理考勤报告,该报告应反映以下输出-员工准时和迟到的考勤计数: 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(Perso

我正在处理考勤报告,该报告应反映以下输出-员工准时和迟到的考勤计数:

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
列中找出它。上面的查询至少可以让我正确地找到
OnTime
Late
数据,但似乎遗漏了什么。以下是表格结构及其示例数据:

 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

测试设置:

谢谢@SqlZim。几乎成功了。你能简单解释一下为什么使用这个-
OnTime=sum(转换时的情况(时间,InTime)<'10:01:00'然后1 else 0 end)
我指的是总和,最后1 else 0?这让我们可以根据你在问题中描述的条件对值进行聚合。或者您可以使用
coalesce(count(convert(time,InTime)<'10:01:00'然后1 end),0)
我实际上无法理解该部分,现在我知道了。非常感谢您,让我们了解或更熟悉
Sql
。它工作得很好。@AT-2016很乐意帮忙!
+------------+--------+------+--------------+
| department | OnTime | Late | Late_10_Mins |
+------------+--------+------+--------------+
|          1 |      2 |    1 |            1 |
|          2 |      0 |    3 |            3 |
+------------+--------+------+--------------+