Table : 人員  日期  打卡次數
表中日期是連續的,求連續三天未打卡的人員。不知道用SQL語句如何做。

解决方案 »

  1.   

    select distinct A.人員
    from @a A,@a B 
    and datediff(day,A.日期,B.日期)=3
    and a.人員=B.人員
    and (select sum(打卡次數) from @a where 日期 between A.日期 and B.日期 and 人員=A.人員 )<3
      

  2.   

    更正一下:
    select distinct A.人員
    from @a A,@a B 
    and datediff(day,A.日期,B.日期)=2
    and a.人員=B.人員
    and (select sum(打卡次數) from @a where 日期 between A.日期 and B.日期 and 人員=A.人員 )<3
      

  3.   


    select distinct 人員 from tb a where 打卡次數=0 and 
    exists(select 1 from tb where 人員=a.人員 and 日期=dateadd(dd,1,a.日期) and 打卡次數=0 )
    and exists(select 1 from tb where 人員=a.人員 and 日期=dateadd(dd,2,a.日期) and 打卡次數=0)
      

  4.   

    晕,还是打错一个地方
    select distinct A.人員
    from @a A,@a B 
    where datediff(day,A.日期,B.日期)=3
    and a.人員=B.人員
    and (select sum(打卡次數) from @a where 日期 between A.日期 and B.日期 and 人員=A.人員 )<3
      

  5.   

    CREATE TABLE TEST  (
    人員 varchar(16) not NULL ,
    日期 datetime not null ,
    打卡次數  int not  NULL
    )
    INSERT INTO TEST VALUES( 'a' , '2008/03/01' , 3)
    INSERT INTO TEST VALUES( 'a' , '2008/03/02' , 0)
    INSERT INTO TEST VALUES( 'a' , '2008/03/03' , 0)
    INSERT INTO TEST VALUES( 'a' , '2008/03/04' , 0)
    INSERT INTO TEST VALUES( 'a' , '2008/03/05' , 4)
    INSERT INTO TEST VALUES( 'a' , '2008/03/06' , 0)
    INSERT INTO TEST VALUES( 'b' , '2008/03/01' , 3)
    INSERT INTO TEST VALUES( 'b' , '2008/03/02' , 0)
    INSERT INTO TEST VALUES( 'b' , '2008/03/03' , 1)
    INSERT INTO TEST VALUES( 'b' , '2008/03/04' , 0)
    INSERT INTO TEST VALUES( 'b' , '2008/03/05'  ,0)
    INSERT INTO TEST VALUES( 'b' , '2008/03/06' , 0)
    INSERT INTO TEST VALUES( 'b' , '2008/03/07' , 7)
    INSERT INTO TEST VALUES( 'c' , '2008/03/01' , 3)
    INSERT INTO TEST VALUES( 'c' , '2008/03/02' , 0)
    INSERT INTO TEST VALUES( 'c' , '2008/03/03' , 1)
    INSERT INTO TEST VALUES( 'c' , '2008/03/04' , 0)
    INSERT INTO TEST VALUES( 'c' , '2008/03/05' , 4)
    INSERT INTO TEST VALUES( 'c' , '2008/03/06' , 0)sdhdy 的結果是正確的。只是感覺這樣做很慢。而且判斷的天數不同的時候,需要改SQL語句或動態生成SQL語句。
      

  6.   

    select min(count(打卡次數))between 日期 and 日期
      

  7.   

    --给楼主来个快的。
    select distinct 人員 from tb a where 
    not exists(select 1 from tb where 人員=a.人員 and (日期 between a.日期 and  dateadd(dd,2,a.日期)) and 打卡次數<>0 )
      

  8.   

    CREATE TABLE TEST  ( 
    人員 varchar(16) not NULL , 
    日期 datetime not null , 
    打卡次數  int not  NULL 

    go
    INSERT INTO TEST VALUES( 'a' , '2008/03/01' , 3) 
    INSERT INTO TEST VALUES( 'a' , '2008/03/02' , 0) 
    INSERT INTO TEST VALUES( 'a' , '2008/03/03' , 0) 
    INSERT INTO TEST VALUES( 'a' , '2008/03/04' , 0) 
    INSERT INTO TEST VALUES( 'a' , '2008/03/05' , 4) 
    INSERT INTO TEST VALUES( 'a' , '2008/03/06' , 0) 
    INSERT INTO TEST VALUES( 'b' , '2008/03/01' , 3) 
    INSERT INTO TEST VALUES( 'b' , '2008/03/02' , 0) 
    INSERT INTO TEST VALUES( 'b' , '2008/03/03' , 1) 
    INSERT INTO TEST VALUES( 'b' , '2008/03/04' , 0) 
    INSERT INTO TEST VALUES( 'b' , '2008/03/05'  ,0) 
    INSERT INTO TEST VALUES( 'b' , '2008/03/06' , 0) 
    INSERT INTO TEST VALUES( 'b' , '2008/03/07' , 7) 
    INSERT INTO TEST VALUES( 'c' , '2008/03/01' , 3) 
    INSERT INTO TEST VALUES( 'c' , '2008/03/02' , 0) 
    INSERT INTO TEST VALUES( 'c' , '2008/03/03' , 1) 
    INSERT INTO TEST VALUES( 'c' , '2008/03/04' , 0) 
    INSERT INTO TEST VALUES( 'c' , '2008/03/05' , 4) 
    INSERT INTO TEST VALUES( 'c' , '2008/03/06' , 0) 
    go
    select distinct 人員 from test a where 
    not exists(select 1 from test where 人員=a.人員 and (日期 between a.日期 and  dateadd(dd,2,a.日期)) and 打卡次數<>0 )
    go
    drop table test
    /*
    人員               
    ---------------- 
    a
    b
    c
    (所影响的行数为 3 行)
    */
      

  9.   

    天数不同的话,楼主只需要把我的dateadd(dd,2,a.日期)中的2改成你需要的天数-1就可以了。
      

  10.   

    理解错次数意思了
    select distinct A.人員
    from test A,test B 
    where datediff(day,A.日期,B.日期)=3
    and a.人員=B.人員
    and (select count(1) from test where 打卡次數 = 0 and 日期 between A.日期 and B.日期 and 人員=A.人員 )=3
      

  11.   

    CREATE TABLE TEST  ( 
    人員 varchar(16) not NULL , 
    日期 datetime not null , 
    打卡次數  int not  NULL 

    INSERT INTO TEST VALUES( 'a' , '2008/03/01' , 3) 
    INSERT INTO TEST VALUES( 'a' , '2008/03/02' , 0) 
    INSERT INTO TEST VALUES( 'a' , '2008/03/03' , 0) 
    INSERT INTO TEST VALUES( 'a' , '2008/03/04' , 0) 
    INSERT INTO TEST VALUES( 'a' , '2008/03/05' , 4) 
    INSERT INTO TEST VALUES( 'a' , '2008/03/06' , 0) 
    INSERT INTO TEST VALUES( 'b' , '2008/03/01' , 3) 
    INSERT INTO TEST VALUES( 'b' , '2008/03/02' , 0) 
    INSERT INTO TEST VALUES( 'b' , '2008/03/03' , 1) 
    INSERT INTO TEST VALUES( 'b' , '2008/03/04' , 0) 
    INSERT INTO TEST VALUES( 'b' , '2008/03/05'  ,0) 
    INSERT INTO TEST VALUES( 'b' , '2008/03/06' , 0) 
    INSERT INTO TEST VALUES( 'b' , '2008/03/07' , 7) 
    INSERT INTO TEST VALUES( 'c' , '2008/03/01' , 3) 
    INSERT INTO TEST VALUES( 'c' , '2008/03/02' , 0) 
    INSERT INTO TEST VALUES( 'c' , '2008/03/03' , 1) 
    INSERT INTO TEST VALUES( 'c' , '2008/03/04' , 0) 
    INSERT INTO TEST VALUES( 'c' , '2008/03/05' , 4) 
    INSERT INTO TEST VALUES( 'c' , '2008/03/06' , 0) select distinct A.人員
    from test A,test B 
    where datediff(day,A.日期,B.日期)=3
    and a.人員=B.人員
    and (select count(1) from test where 打卡次數 = 0 and 日期 between A.日期 and B.日期 and 人員=A.人員 )>=3
    /*人員
    ----------------
    a
    b
    */drop table test
      

  12.   

    --modify,把没有的日期也给判断进去了。
    CREATE TABLE TEST  ( 
    人員 varchar(16) not NULL , 
    日期 datetime not null , 
    打卡次數  int not  NULL 

    go
    INSERT INTO TEST VALUES( 'a' , '2008/03/01' , 3) 
    INSERT INTO TEST VALUES( 'a' , '2008/03/02' , 0) 
    INSERT INTO TEST VALUES( 'a' , '2008/03/03' , 0) 
    INSERT INTO TEST VALUES( 'a' , '2008/03/04' , 0) 
    INSERT INTO TEST VALUES( 'a' , '2008/03/05' , 4) 
    INSERT INTO TEST VALUES( 'a' , '2008/03/06' , 0) 
    INSERT INTO TEST VALUES( 'b' , '2008/03/01' , 3) 
    INSERT INTO TEST VALUES( 'b' , '2008/03/02' , 0) 
    INSERT INTO TEST VALUES( 'b' , '2008/03/03' , 1) 
    INSERT INTO TEST VALUES( 'b' , '2008/03/04' , 0) 
    INSERT INTO TEST VALUES( 'b' , '2008/03/05'  ,0) 
    INSERT INTO TEST VALUES( 'b' , '2008/03/06' , 0) 
    INSERT INTO TEST VALUES( 'b' , '2008/03/07' , 7) 
    INSERT INTO TEST VALUES( 'c' , '2008/03/01' , 3) 
    INSERT INTO TEST VALUES( 'c' , '2008/03/02' , 0) 
    INSERT INTO TEST VALUES( 'c' , '2008/03/03' , 1) 
    INSERT INTO TEST VALUES( 'c' , '2008/03/04' , 0) 
    INSERT INTO TEST VALUES( 'c' , '2008/03/05' , 4) 
    INSERT INTO TEST VALUES( 'c' , '2008/03/06' , 0) 
    go
    select distinct 人員 from test a where 
    (select count(1) from test where 人員=a.人員 and (日期 between a.日期 and  dateadd(dd,2,a.日期)) and 打卡次數=0)=3
    go
    drop table test
    /*
    人員               
    ---------------- 
    a
    b
    (所影响的行数为 2 行)
    */