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

再提sql统计语句(请 潇洒老乌龟关注!),该怎么处理

2012-02-27 
再提sql统计语句(请 潇洒老乌龟关注!)上次我提了个统计语句的问题是这样的:从一个表中统计出每天没台终端

再提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 来

热点排行