首页 新闻 会员 周边

sql查询统计

0
悬赏园豆:200 [已解决问题] 解决于 2015-06-23 17:07

公司考勤统计

已知:

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

grn0515的主页 grn0515 | 初学一级 | 园豆:22
提问于:2015-06-23 15:16
< >
分享
最佳答案
0

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

收获园豆:180
Yu | 专家六级 |园豆:12980 | 2015-06-23 16:07

也不对,也查不出所有的部门,而且考勤记录里面有重复的数据也没有去掉

grn0515 | 园豆:22 (初学一级) | 2015-06-23 16:31

@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

Yu | 园豆:12980 (专家六级) | 2015-06-23 16:40

@grn0515: 所有部门是可以查出来的

Yu | 园豆:12980 (专家六级) | 2015-06-23 16:41

@Yu: 所有部门是查出来,但是去重复不对,你这是去的部门重复数据,不是用户重复数据,用户一天只需要一条考勤记录

grn0515 | 园豆:22 (初学一级) | 2015-06-23 16:58

@grn0515: 你把 dbo.T_Records.AttendDate 统一一下格式,就可以了

Yu | 园豆:12980 (专家六级) | 2015-06-23 17:02

@Yu: 嗯,自己改了下,可以了,谢谢了

grn0515 | 园豆:22 (初学一级) | 2015-06-23 17:06
其他回答(1)
0

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'

收获园豆:20
webaspx | 园豆:1973 (小虾三级) | 2015-06-23 15:32

这样有个问题,如果有个部门当天都没有考勤记录,你这里就统计不出来,就是有缺省数据的时候,还需要补差

支持(0) 反对(0) grn0515 | 园豆:22 (初学一级) | 2015-06-23 15:44

还有就是部门里面的人也不能全部查出来

支持(0) 反对(0) grn0515 | 园豆:22 (初学一级) | 2015-06-23 15:48

@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.名称

 

支持(0) 反对(0) webaspx | 园豆:1973 (小虾三级) | 2015-06-23 16:05

@webaspx: 额,不好意思,我是在sqlserver环境下

支持(0) 反对(0) grn0515 | 园豆:22 (初学一级) | 2015-06-23 16:23

@grn0515: 这跟在什么环境下没关系。上面的sql在SQLserver里面应该也能执行。

支持(0) 反对(0) webaspx | 园豆:1973 (小虾三级) | 2015-06-23 16:29
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册