请教SQL

kook 2012-11-02 04:37:46
数据库: 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结果有冗余记录)
...全文
168 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
kook 2012-11-05
  • 打赏
  • 举报
回复
OK,可以用,分再给你罗
WWWWA 2012-11-02
  • 打赏
  • 举报
回复
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');

or

SELECT 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');
WWWWA 2012-11-02
  • 打赏
  • 举报
回复
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')
kook 2012-11-02
  • 打赏
  • 举报
回复
6.25就是那一天出勤6.25小时

汇总就是要去掉同一天重复的出勤时间后再sum

去掉重复时间就是上面的那个SQL(将同日期同员工的重复出勤时间计为0,只计一个),然后再求和
WWWWA 2012-11-02
  • 打赏
  • 举报
回复
出勤总时间:直接SUM不行?6.25是什么意思 ?
select date_format(日期,'%Y%m'),员工ID, sum(出勤时间) from ttt group by date_format(日期,'%Y%m')
kook 2012-11-02
  • 打赏
  • 举报
回复
谢谢,果然是高手啊
可以再帮我写一个汇总sql么
还是这个表,想得到按月按人汇总的出勤总时间
WWWWA 2012-11-02
  • 打赏
  • 举报
回复
or
SELECT *,IF(EXISTS (SELECT 1 FROM ttt WHERE
a.`员工id`=`员工id` AND a.`日期`=`日期` AND a.`明细表ID`>`明细表ID`
),0,出勤时间) AS ss
FROM ttt a
WWWWA 2012-11-02
  • 打赏
  • 举报
回复
稍微修改一下嘛
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`

56,673

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧