公司考勤统计
已知:
1.T_Dept 部门表 ,表里有编号、名称、说明三个字段
2.T_User 用户表 , 表里有编号、姓名、部门编号 三个字段
3.T_Records 考勤记录表,表里有编号、用户ID、时间 三个字段
求:1.按天统计各部门里面应到多少人,实到多少人,缺勤多少人
2.按月统计用户应到次数,实到次数,缺陷次数
结果:1.2015-06-23 一天的数据
部门 应到人次 实到人次 缺勤人次
人事部 10 9 1
开发部 20 11 9
销售部 30 0 30
2.2015-06 一月的数据
姓名 应到次数 实到次数 缺勤次数
张三 30 30 0
李四 30 23 7
王五 30 28 2
SELECT dbo.T_Dept.Name, COUNT(dbo.T_User.Id) AS Expected,
SUM(CASE WHEN dbo.T_Records.AttendDate IS NULL THEN 0 ELSE 1 END) AS Attended,
SUM(CASE WHEN dbo.T_User.DeptId IS NOT NULL
AND dbo.T_Records.AttendDate IS NULL THEN 1 ELSE 0 END) AS Absented
FROM dbo.T_Dept LEFT OUTER JOIN
dbo.T_User ON dbo.T_Dept.Id = dbo.T_User.DeptId LEFT OUTER JOIN
dbo.T_Records ON dbo.T_User.Id = dbo.T_Records.UserId
WHERE (dbo.T_Records.AttendDate >= '2015-6-23') AND (dbo.T_Records.AttendDate < '2015-6-24') OR
(dbo.T_Records.AttendDate IS NULL)
GROUP BY dbo.T_Dept.Name
也不对,也查不出所有的部门,而且考勤记录里面有重复的数据也没有去掉
@grn0515:
SELECT Name, COUNT(Id) AS Expected, SUM(CASE WHEN AttendDate IS NULL THEN 0 ELSE 1 END) AS Attended,
SUM(CASE WHEN Id IS NOT NULL
AND AttendDate IS NULL THEN 1 ELSE 0 END) AS Absented
from
(
SELECT DISTINCT dbo.T_Dept.Name, dbo.T_User.Id ,dbo.T_Records.AttendDate
FROM dbo.T_Dept LEFT OUTER JOIN
dbo.T_User ON dbo.T_Dept.Id = dbo.T_User.DeptId LEFT OUTER JOIN
dbo.T_Records ON dbo.T_User.Id = dbo.T_Records.UserId
WHERE (dbo.T_Records.AttendDate >= '2015-6-23') AND (dbo.T_Records.AttendDate < '2015-6-24') OR
(dbo.T_Records.AttendDate IS NULL)) as t
group by t.Name
@grn0515: 所有部门是可以查出来的
@Yu: 所有部门是查出来,但是去重复不对,你这是去的部门重复数据,不是用户重复数据,用户一天只需要一条考勤记录
@grn0515: 你把 dbo.T_Records.AttendDate 统一一下格式,就可以了
@Yu: 嗯,自己改了下,可以了,谢谢了
1.
SELECT t.名称, COUNT(u.编号) 应到人次, SUM(CASE WHEN r.用户Id=NULL THEN 0 ELSE 1 END) 实到人次 SUM(CASE WHEN r.用户Id=NULL THEN 1 ELSE 0 END) 缺勤人次 FROM T_dept t JOIN T_User u ON t.编号=u.部门编号 LEFT JOIN T_Records r ON u.编号=r.用户Id AND 转日期(t.时间)='2015-06-23' GROUP BY t.名称
2. 第二个跟第一个差不多,只是group的是T_User中的姓名,转月(t.时间)='2015-06'
这样有个问题,如果有个部门当天都没有考勤记录,你这里就统计不出来,就是有缺省数据的时候,还需要补差
还有就是部门里面的人也不能全部查出来
@grn0515: 为什么会统计不出来呢?
修改下SQL:(我是在oracle环境下的sql)
SELECT t.名称, COUNT(u.编号)应到, SUM(CASE WHEN r.用户id IS NULL THEN 0 ELSE 1 END) 实到, SUM(CASE WHEN r.用户id IS NULL THEN 1 ELSE 0 END) 缺勤 FROM T_dept t JOIN T_User u ON t.编号=u.部门编号 LEFT JOIN T_Records r ON u.编号=r.用户Id AND r.时间=to_date('2015-06-23','yyyy-mm-dd') GROUP BY t.名称
@webaspx: 额,不好意思,我是在sqlserver环境下
@grn0515: 这跟在什么环境下没关系。上面的sql在SQLserver里面应该也能执行。