数据库: mysql 表名: r_mstr
字段: r_date, r_emp, r_time, r_det_id日期 员工ID 出勤时间 明细表ID
2012/11/01 1101 6.25 6
2012/11/01 1102 6.25 7
2012/11/01 1103 6.25 8
2012/11/01 1104 6.25 9
2012/11/02 1101 6.25 10
2012/10/22 1101 8 11
2012/10/05 1101 8 12
2012/09/02 1101 8 13
2012/11/01 1101 6.25 14
2012/11/02 2101 6 15
2012/11/02 2101 6 16
2012/11/02 2101 6 17
2012/12/02 2102 7 18
2012/10/02 2101 5.5 19
2012/11/02 2101 6 20
2012/10/02 2102 5.5 21
2012/11/02 1201 6.25 22
2012/11/02 1202 8 23
2012/11/02 1102 6.25 24
2012/11/02 2201 6 25
2012/11/02 2203 6 26
2012/11/02 2203 6 27希望select出的结果是下面的样子
(将同一员工同一日期的重复出勤时间设为0,记录数不能少,也不能多!)日期 员工ID 出勤时间 明细表ID
2012/11/01 1101 6.25 6
2012/11/01 1102 6.25 7
2012/11/01 1103 6.25 8
2012/11/01 1104 6.25 9
2012/11/02 1101 6.25 10
2012/10/22 1101 8 11
2012/10/05 1101 8 12
2012/09/02 1101 8 13
2012/11/01 1101 0 14
2012/11/02 2101 6 15
2012/11/02 2101 0 16
2012/11/02 2101 0 17
2012/12/02 2102 7 18
2012/10/02 2101 5.5 19
2012/11/02 2101 0 20
2012/10/02 2102 5.5 21
2012/11/02 1201 6.25 22
2012/11/02 1202 8 23
2012/11/02 1102 6.25 24
2012/11/02 2201 6 25
2012/11/02 2203 6 26
2012/11/02 2203 0 27(刚才另一贴同样问题已结贴,确认太快了,答案不准确,select结果有冗余记录)

解决方案 »

  1.   

    稍微修改一下嘛
    SELECT DISTINCT a.`日期`,a.`员工id`,IF(b.`出勤时间` IS NULL,a.`出勤时间`,0),a.`明细表ID`  
    FROM ttt a LEFT JOIN ttt b ON a.`员工id`=b.`员工id` AND a.`日期`=b.`日期` AND a.`明细表ID`>b.`明细表ID`
      

  2.   

    or
    SELECT *,IF(EXISTS (SELECT 1 FROM ttt WHERE 
     a.`员工id`=`员工id` AND a.`日期`=`日期` AND a.`明细表ID`>`明细表ID`
    ),0,出勤时间) AS ss  
     FROM ttt a
      

  3.   

    谢谢,果然是高手啊
    可以再帮我写一个汇总sql么
    还是这个表,想得到按月按人汇总的出勤总时间
      

  4.   

    出勤总时间:直接SUM不行?6.25是什么意思 ?
    select date_format(日期,'%Y%m'),员工ID, sum(出勤时间) from ttt group by date_format(日期,'%Y%m')
      

  5.   

    6.25就是那一天出勤6.25小时汇总就是要去掉同一天重复的出勤时间后再sum去掉重复时间就是上面的那个SQL(将同日期同员工的重复出勤时间计为0,只计一个),然后再求和
      

  6.   

    SELECT DATE_FORMAT(日期,'%Y%m'),员工ID, SUM(ss) FROM 
    (SELECT *,IF(EXISTS (SELECT 1 FROM ttt WHERE  
      a.`员工id`=`员工id` AND a.`日期`=`日期` AND a.`明细表ID`>`明细表ID`
    ),0,出勤时间) AS ss   
      FROM ttt a)ttt 
    GROUP BY DATE_FORMAT(日期,'%Y%m')
      

  7.   

    SELECT DATE_FORMAT(日期,'%Y%m'),员工ID, SUM(ss) FROM 
    (SELECT *,IF(EXISTS (SELECT 1 FROM ttt WHERE  
      a.`员工id`=`员工id` AND a.`日期`=`日期` AND a.`明细表ID`>`明细表ID`
    ),0,出勤时间) AS ss   
      FROM ttt a)ttt 
    GROUP BY 员工ID,DATE_FORMAT(日期,'%Y%m');orSELECT DATE_FORMAT(日期,'%Y%m'),员工ID, 
    SUM(IF(EXISTS (SELECT 1 FROM ttt WHERE  
      a.`员工id`=`员工id` AND a.`日期`=`日期` AND a.`明细表ID`>`明细表ID`
    ),0,出勤时间)) AS ss  FROM ttt a GROUP BY 员工ID,DATE_FORMAT(日期,'%Y%m');