再提sql统计语句(请 潇洒老乌龟关注!)
上次我提了个统计语句的问题
是这样的:
从一个表中统计出每天没台终端的开关机状态。
表中主要包括:终端编号(mobile),(lasttime)时间,(runstatus)终端状态
等字段 ,无主键。
终端状态每天记录4次,即lasttime 记录同一天的四个时间段(如2007-8-24 08:45)。状态有三种(0 正常,2 数据无效,1 关机),其中,0和2 都算是开机,每天的四个时间段中有一次开机,这一天算是开机,四次都关机,算是关机。
要求统计出,一个时间段内每天没台终端的开关机状态。
后来简化为如下问题:
如果改成如下:
id name cardid time status 这个是字段 表名 jc_table
1 111 111 2007-8-15 08:00:22 来
1 111 111 2007-8-15 13:30:22 迟到
2 222 222 2007-8-15 08:00:22 没来
2 222 222 2007-8-15 13:30:22 没来
3 111 111 2007-8-15 08:00:22 没来
3 333 333 2007-8-15 13:30:22 来
我想的到结果是
id name cardid status
1 111 111 来
2 222 222 没来
3 333 333 来
即 同一天的两次考勤中,有一次来了(包括迟到)算来,两次都没来的算没来!
表中记录一个月中,每人的考勤记录,要求统计每天每人的出勤情况。
后来老乌龟同志帮我解决了
如下:
create table tb(id int, name varchar(10) , cardid varchar(10),time datetime,status varchar(10))
insert into tb values(1, '111 ', '111 ', '2007-8-15 08:00:22 ', '来 ')
insert into tb values(1, '111 ', '111 ', '2007-8-15 13:30:22 ', '迟到 ')
insert into tb values(2, '222 ', '222 ', '2007-8-15 08:00:22 ', '没来 ')
insert into tb values(2, '222 ', '222 ', '2007-8-15 13:30:22 ', '没来 ')
insert into tb values(3, '111 ', '111 ', '2007-8-15 08:00:22 ', '没来 ')
insert into tb values(3, '333 ', '333 ', '2007-8-1513:30:22 ', '来 ')
select distinct * from
(
select id,name,cardid,convert(varchar(10),time,120) time , status = '没来 ' from tb where id not in
(
select id from tb where status = '来 ' or status = '迟到 '
)
union all
select id,name,cardid,convert(varchar(10),time,120) time , status = '来 ' from tb where status = '来 ' or status = '迟到 '
) m
order by id,name, time
drop table tb
/*
id name cardid time status
----------- ---------- ---------- ---------- ------
1 111 111 2007-08-15 来
2 222 222 2007-08-15 没来
3 333 333 2007-08-15 来
(所影响的行数为 3 行)
*/
/////////////////////////////
可是我当时把问题简化时,忽略了细节,悟道了他。
实际问题因该修改如下:
id name cardid time status 这个是字段 表名 jc_table
1 111 111 2007-8-15 08:00:22 来
1 111 111 2007-8-15 13:30:22 迟到
1 111 111 2007-8-16 08:00:22 没来
1 111 111 2007-8-16 13:30:22 没来
2 222 222 2007-8-15 08:00:22 没来
2 222 222 2007-8-15 13:30:22 没来
2 222 222 2007-8-16 08:00:22 来
2 222 222 2007-8-16 13:30:22 没来
3 333 333 2007-8-15 08:00:22 没来
3 333 333 2007-8-15 13:30:22 来
我想的到结果是
id name cardid time status
1 111 111 2007-8-15 来
1 111 111 2007-8-16 没来
2 222 222 2007-8-15 没来
2 222 222 2007-8-16 来
3 333 333 2007-8-15 来
即 同一天的两次考勤中,有一次来了(包括迟到)算来,两次都没来的算没来!
表中记录一个月中,每人的考勤记录,要求统计每月中每天每人的出勤情况。
(注:上次的解决方法中如果一月中出现‘来’的情况,本月中所有‘没来’情况统计不出来。想了好久还是没法子,只能请教各位了,多谢!!)
[解决办法]
create table jc_table(id int, name varchar(10) , cardid varchar(10),time datetime,status varchar(10))
insert into jc_table values(1, '111 ', '111 ', '2007-8-15 08:00:22 ', '来 ')
insert into jc_table values(1, '111 ', '111 ', '2007-8-15 13:30:22 ', '迟到 ')
insert into jc_table values(2, '222 ', '222 ', '2007-8-15 08:00:22 ', '没来 ')
insert into jc_table values(2, '222 ', '222 ', '2007-8-15 13:30:22 ', '没来 ')
insert into jc_table values(3, '333 ', '333 ', '2007-8-15 08:00:22 ', '没来 ')
insert into jc_table values(3, '333 ', '333 ', '2007-8-15 13:30:22 ', '来 ')
insert into jc_table values(4, '4 ', '4 ', '2007-8-15 08:00:22 ', '来 ')
insert into jc_table values(4, '4 ', '4 ', '2007-8-15 13:30:22 ', '来 ')
select id,name,cardid,time=convert(varchar(10),time,120),
status=(case when exists(
select 1 from jc_table t where t.cardid=jc_table.cardid and t.time <> jc_table.time
and datediff(day,t.time,jc_table.time)=0 and t.status=jc_table.status and t.status= '没来 '
) then '没来 ' else '来 ' end)
from jc_table
where datepart(hh,time) <13
order by id,time
---------------
id name cardid time status
----------- ---------- ---------- ---------- ------
1 111 111 2007-08-15 来
2 222 222 2007-08-15 没来
3 333 333 2007-08-15 来
4 4 4 2007-08-15 来