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
更正一下: 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
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)
晕,还是打错一个地方 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
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語句。
select min(count(打卡次數))between 日期 and 日期
--给楼主来个快的。 select distinct 人員 from tb a where not exists(select 1 from tb where 人員=a.人員 and (日期 between a.日期 and dateadd(dd,2,a.日期)) and 打卡次數<>0 )
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 行) */
理解错次数意思了 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
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
--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 行) */
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
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
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)
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
人員 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語句。
select distinct 人員 from tb a where
not exists(select 1 from tb where 人員=a.人員 and (日期 between a.日期 and dateadd(dd,2,a.日期)) and 打卡次數<>0 )
人員 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 行)
*/
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
人員 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
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 行)
*/