各位好,我正在做一个考勤程序,我现在要统计每个部门的每个人的考勤记录,要求是同一天的只算一次考勤记录,例如:表:考勤记录表
字段:部门名称,员工名称,打卡时间       其中打卡时间的数据是从打卡机上读取而来,同一天内会有多条打卡记录。我的sql语句:select 部门名称,员工名称,count(打卡时间) from 考勤记录表 group by 部门名称,员工名称我目前还不清楚该如何写SQL,才能做到只统计不同日期的打卡记录,同一天内的打卡记录只统计一次?请各位多多赐教,不胜感激!

解决方案 »

  1.   

    select 部门名称,员工名称,count(打卡时间) from 考勤记录表 group by 部门名称,员工名称,trunc(打卡时间);
      

  2.   

    有问题,具体请看内容:
    查询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放到分组里好像有问题啊?
      

  3.   


    select 部门名称,员工名称,count(1)
    from (select distinct 部门名称,员工名称,to_char(打卡时间,'yyyy-mm-dd') from 考勤记录表)
    group by 部门名称,员工名称
      

  4.   

    create index idx_no on 考勤记录表(部门名称,员工名称)
    --或者这样
    select 部门名称,员工名称,count(打卡时间) 考勤次数
    from 考勤记录表 a
    where not exists(select 1 from 考勤记录表 b where a.部门名称=b.部门名称 
    and a.员工名称=b.员工名称 and a.打卡时间<b.打卡时间)
    group by 部门名称,员工名称
      

  5.   

    你的ZCKQ是date类型的字段吗? 如果不是按照这样的写:
    select 部门名称,员工名称,count(打卡时间) from 考勤记录表 group by 部门名称,员工名称,trunc(to_date(打卡时间,'yyyy/mm/dd hh24:mi:ss'),'dd') order by 员工名称
      

  6.   

    用的是PL/SQL测试第一种耗时:0.078秒
    第二种方法有问题,不过耗时只有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
      

  7.   

    唉,csdn的排版让我挠头啊,格式又乱了....
      

  8.   

    回vber1010,打卡时间是datetime类型的
      

  9.   

    这个东西忘记个东西了
    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 部门名称,员工名称
    ---报下运行时间
      

  10.   

    wkc168:很抱歉,你说的第二中办法也是可执行的,结果不对,耗时0.031秒
    结果:
    1 10 员工1 1
    2 22 员工2 1
    3 22 员工3 1
    4 41 员工4 1
      

  11.   

    wkc168:结果正确了,用PL/SQL测试sql语句第一种耗时:0.078秒
    第二种方式:0.016秒