首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

求一条关于考勤的SQL话语

2013-08-04 
求一条关于考勤的SQL语句有一张表:ID姓名考勤时间1张三2013-7-1 7:401张三2013-7-1 7:421张三2013-7-1 11:

求一条关于考勤的SQL语句
有一张表:
ID  姓名  考勤时间
1   张三   2013-7-1 7:40
1   张三   2013-7-1 7:42
1   张三   2013-7-1 11:40
1   张三   2013-7-2 18:40
1   张三   2013-7-2 7:50
1   张三   2013-7-2 11:50
1   张三   2013-7-2 18:10
2   李四  2013-7-1 7:40
2   李四   2013-7-1 11:40
2   李四   2013-7-2 18:40
2   李四   2013-7-2 7:50
2   李四   2013-7-2 18:10
3   王五  2013-7-1 8:40
3   王五   2013-7-1 11:40
3   王五   2013-7-2 17:40
3   王五   2013-7-2 7:50
3   王五   2013-7-2 12:00
其中考勤时间7点到9点为早餐时间,11点到13点为中餐时间,17点到19点为晚餐时间
我想统计出张三,李四,王五个人在7月份中,早餐,中餐,晚餐的考勤情况,其中重复打卡记录过滤,例如张三在7月1日早餐出现两次打卡只取一次,即得出下表:
姓名 早餐  中餐  晚餐
张三 2     2    2
李四 2     1    2
王五 2     2     1
[解决办法]

create table #tb(id int,name varchar(10),ktime datetime)
insert into #tb(id,name,ktime)
select 1 ,'张三' ,'2013-07-01 7: 40' 
union all select 1,'张三','2013-07-01 7: 42'
union all select 1,'张三','2013-07-01 11: 40'
union all select 1,'张三','2013-07-02 18: 40'
union all select 1,'张三','2013-07-02 7: 50'
union all select 1,'张三','2013-07-02 11: 50'
union all select 1,'张三','2013-07-02 18: 10'
union all select 2,'李四','2013-07-01 7: 40'
union all select 2,'李四','2013-07-01 11: 40'
union all select 2,'李四','2013-07-02 18: 40'
union all select 2,'李四','2013-07-02 7: 50'
union all select 2,'李四','2013-07-02 18: 10'


union all select 3,'王五','2013-07-01 8: 40'
union all select 3,'王五','2013-07-01 11: 40'
union all select 3,'王五','2013-07-02 17: 40'
union all select 3,'王五','2013-07-02 7: 50'
union all select 3,'王五','2013-07-02 12: 00'

select * from #tb

select name 姓名,case when 早餐>2 then 2 else 早餐 end 早餐,
case when 中餐>2 then 2 else 中餐 end 中餐,
case when 晚餐>2 then 2 else 晚餐 end 晚餐
from (
select name,
早餐=sum(case when CONVERT(varchar(8),ktime,108) between '07:00:00' and '09:0000' then 1 else 0 end),
中餐=sum(case when CONVERT(varchar(8),ktime,108) between '11:00:00' and '13:0000' then 1 else 0 end),
晚餐=sum(case when CONVERT(varchar(8),ktime,108) between '17:00:00' and '19:0000' then 1 else 0 end)
from #tb
group by name
)t

drop table #tb

/*
李四212
王五221
张三222
*/


[解决办法]
修改后代码如下!!!!
select name 姓名,SUM(早餐) 早餐,SUM(中餐) 中餐,SUM(晚餐) 晚餐,CONVERT(varchar(7),ktime,120) as 月份
from (
select name,CONVERT(varchar(10),ktime,120) as ktime,
早餐=case when  sum(case when CONVERT(varchar(8),ktime,108) between '07:00:00' and '09:0000' then 1 else 0 end)>=1 then 1 else 0 end,
中餐=case when sum(case when CONVERT(varchar(8),ktime,108) between '11:00:00' and '13:0000' then 1 else 0 end)>=1 then 1 else 0 end,
晚餐=case when sum(case when CONVERT(varchar(8),ktime,108) between '17:00:00' and '19:0000' then 1 else 0 end)>=1 then 1 else 0 end
from #tb
group by CONVERT(varchar(10),ktime,120),name
)t group by CONVERT(varchar(7),ktime,120),name

热点排行