各位好,我正在做一个考勤程序,我现在要统计每个部门的每个人的考勤记录,要求是同一天的只算一次考勤记录,例如:表:考勤记录表
字段:部门名称,员工名称,打卡时间 其中打卡时间的数据是从打卡机上读取而来,同一天内会有多条打卡记录。我的sql语句:select 部门名称,员工名称,count(打卡时间) from 考勤记录表 group by 部门名称,员工名称我目前还不清楚该如何写SQL,才能做到只统计不同日期的打卡记录,同一天内的打卡记录只统计一次?请各位多多赐教,不胜感激!
字段:部门名称,员工名称,打卡时间 其中打卡时间的数据是从打卡机上读取而来,同一天内会有多条打卡记录。我的sql语句:select 部门名称,员工名称,count(打卡时间) from 考勤记录表 group by 部门名称,员工名称我目前还不清楚该如何写SQL,才能做到只统计不同日期的打卡记录,同一天内的打卡记录只统计一次?请各位多多赐教,不胜感激!
查询sql:
select 部门名称,员工名称,打卡时间 from 考勤记录表 order by 员工名称结果:
部门名称 员工名称 打卡时间
1 dddd 员工1 2010/08/26 14:05:07
2 dddd 员工1 2010/08/27 08:32:22
3 dddd 员工1 2010/08/27 08:31:30
4 dddd 员工1 2010/08/26 15:07:29
5 dddd 员工1 2010/08/27 08:30:15
6 测试B 员工2 2010/08/26 10:07:29
7 测试B 员工3 2010/08/27 08:32:35
8 测试B 员工3 2010/08/26 13:07:29
9 测试B 员工3 2010/08/27 08:32:54
10 测试C 员工4 2010/08/26 16:05:29
11 测试C 员工4 2010/08/30 10:20:14
12 测试C 员工4 2010/08/30 10:20:58我的原始SQL:
select 部门名称,员工名称,count(打卡时间) as ZCKQ from 考勤记录表 group by 部门名称,员工名称 order by 员工名称结果:
部门名称 员工名称 ZCKQ
1 dddd 员工1 5
2 测试B 员工2 1
3 测试B 员工3 3
4 测试C 员工4 3nGX20080110的SQL:
select 部门名称,员工名称,count(打卡时间) from 考勤记录表 group by 部门名称,员工名称,trunc(打卡时间) order by 员工名称结果:
部门名称 员工名称 ZCKQ
1 dddd 员工1 2
2 dddd 员工1 3
3 测试B 员工2 1
4 测试B 员工3 1
5 测试B 员工3 2
6 测试C 员工4 1
7 测试C 员工4 2
trunck放到分组里好像有问题啊?
select 部门名称,员工名称,count(1)
from (select distinct 部门名称,员工名称,to_char(打卡时间,'yyyy-mm-dd') from 考勤记录表)
group by 部门名称,员工名称
--或者这样
select 部门名称,员工名称,count(打卡时间) 考勤次数
from 考勤记录表 a
where not exists(select 1 from 考勤记录表 b where a.部门名称=b.部门名称
and a.员工名称=b.员工名称 and a.打卡时间<b.打卡时间)
group by 部门名称,员工名称
select 部门名称,员工名称,count(打卡时间) from 考勤记录表 group by 部门名称,员工名称,trunc(to_date(打卡时间,'yyyy/mm/dd hh24:mi:ss'),'dd') order by 员工名称
第二种方法有问题,不过耗时只有0.032秒
结果如下:1 dddd 员工1 2
2 测试B 员工1 1
3 测试C 员工1 1
4 dddd 员工2 2
5 测试B 员工2 1
6 测试C 员工2 1
7 dddd 员工3 2
8 测试B 员工3 1
9 测试C 员工3 1
10 dddd 员工4 2
11 测试B 员工4 1
12 测试C 员工4 1
select 部门名称,员工名称,count(打卡时间) 考勤次数
from 考勤记录表 a
where not exists(select 1 from 考勤记录表 b where a.部门名称=b.部门名称
and a.员工名称=b.员工名称
and to_char(a.打卡时间,'yyyy-mm-dd')=to_char(b.打卡时间,'yyyy-mm-dd')
and a.打卡时间<b.打卡时间)
group by 部门名称,员工名称
---报下运行时间
结果:
1 10 员工1 1
2 22 员工2 1
3 22 员工3 1
4 41 员工4 1
第二种方式:0.016秒