27,579
社区成员
发帖
与我相关
我的任务
分享
--考勤表fty_grkq,我只列了部分数据,如下(type:W 为正常上班,F为法定假期,J为请假,H为半天请假,X为休息)
--请假记录表fty_leave
--问题:根据请假记录表更新考勤表的数据,要考虑多个员工的情况,每个员工每月请假记录可能有多条
--结果应该如下:
/*
D6686 2009-05-01 F NULL NULL NULL NULL
D6686 2009-05-02 X NULL NULL NULL NULL
D6686 2009-05-03 X NULL NULL NULL NULL
D6686 2009-05-04 W 08:00:24 12:03:31 13:52:20 18:01:36
D6686 2009-05-05 X NULL NULL NULL NULL
D6686 2009-05-06 X NULL NULL NULL NULL
D6686 2009-05-07 X NULL NULL NULL NULL
D6686 2009-05-08 X NULL NULL NULL NULL
D6686 2009-05-09 X NULL NULL NULL NULL
D6686 2009-05-10 X NULL NULL NULL NULL
D6686 2009-05-11 W 08:00:24 12:03:31 13:52:20 18:01:36
D6686 2009-05-12 X NULL NULL NULL NULL
D6686 2009-05-13 X NULL NULL NULL NULL
D6686 2009-05-14 X NULL NULL NULL NULL
D6686 2009-05-15 H 08:00:24 12:03:31NULL NULL
D6686 2009-05-16 X NULL NULL NULL NULL
D6686 2009-05-17 X NULL NULL NULL NULL
D6686 2009-05-18 W 08:00:24 12:03:31 13:52:20 18:01:36
D6686 2009-05-19 W 08:00:24 12:03:31 13:52:20 18:01:36
D6686 2009-05-20 W 08:00:24 12:03:31 13:52:20 18:01:36
D6686 2009-05-21 W 08:00:24 12:03:31 13:52:20 18:01:36
D6686 2009-05-22 W 08:00:24 12:03:31 13:52:20 18:01:36
D6686 2009-05-23 X NULL NULL NULL NULL
D6686 2009-05-24 X NULL NULL NULL NULL
D6686 2009-05-25 W 08:00:24 12:03:31 13:52:20 18:01:36
D6686 2009-05-26 W 08:00:24 12:03:31 13:52:20 18:01:36
D6686 2009-05-27 W 08:00:24 12:03:31 13:52:20 18:01:36
D6686 2009-05-28 F NULL NULL NULL NULL
D6686 2009-05-29 W 08:00:24 12:03:31 13:52:20 18:01:36
D6686 2009-05-30 X NULL NULL NULL NULL
D6686 2009-05-31 X NULL NULL NULL NULL
D3686 2009-05-01 F NULL NULL NULL NULL
D3686 2009-05-02 X NULL NULL NULL NULL
D3686 2009-05-03 X NULL NULL NULL NULL
D3686 2009-05-04 W 08:00:24 12:03:31 13:52:20 18:01:36
D3686 2009-05-05 W 08:00:24 12:03:31 13:52:20 18:01:36
D3686 2009-05-06 X NULL NULL NULL NULL
D3686 2009-05-07 X NULL NULL NULL NULL
D3686 2009-05-08 H 08:00:24 12:03:31 NULL NULL
D3686 2009-05-09 X NULL NULL NULL NULL
D3686 2009-05-10 X NULL NULL NULL NULL
*/
--> 测试数据:fty_grkq
if object_id('fty_grkq') is not null
drop table fty_grkq
create table fty_grkq ([mem_id] varchar(5),[adate] varchar(10),[type] varchar(1),
[a1] varchar(8),[a2] varchar(8),[a3] varchar(8),[a4] varchar(8))
insert into fty_grkq
select 'D6686','2009-05-01','F',null,null,null,null union all
select 'D6686','2009-05-02','X',null,null,null,null union all
select 'D6686','2009-05-03','X',null,null,null,null union all
select 'D6686','2009-05-04','W','08:00:24','12:03:31','13:52:20','18:01:36' union all
select 'D6686','2009-05-05','W','08:00:24','12:03:31','13:52:20','18:01:36' union all
select 'D6686','2009-05-06','W','08:00:24','12:03:31','13:52:20','18:01:36' union all
select 'D6686','2009-05-07','W','08:00:24','12:03:31','13:52:20','18:01:36' union all
select 'D6686','2009-05-08','W','08:00:24','12:03:31','13:52:20','18:01:36' union all
select 'D6686','2009-05-09','X',null,null,null,null union all
select 'D6686','2009-05-10','X',null,null,null,null union all
select 'D6686','2009-05-11','W','08:00:24','12:03:31','13:52:20','18:01:36' union all
select 'D6686','2009-05-12','W','08:00:24','12:03:31','13:52:20','18:01:36' union all
select 'D6686','2009-05-13','W','08:00:24','12:03:31','13:52:20','18:01:36' union all
select 'D6686','2009-05-14','W','08:00:24','12:03:31','13:52:20','18:01:36' union all
select 'D6686','2009-05-15','W','08:00:24','12:03:31','13:52:20','18:01:36' union all
select 'D6686','2009-05-16','X',null,null,null,null union all
select 'D6686','2009-05-17','X',null,null,null,null union all
select 'D6686','2009-05-18','W','08:00:24','12:03:31','13:52:20','18:01:36' union all
select 'D6686','2009-05-19','W','08:00:24','12:03:31','13:52:20','18:01:36' union all
select 'D6686','2009-05-20','W','08:00:24','12:03:31','13:52:20','18:01:36' union all
select 'D6686','2009-05-21','W','08:00:24','12:03:31','13:52:20','18:01:36' union all
select 'D6686','2009-05-22','W','08:00:24','12:03:31','13:52:20','18:01:36' union all
select 'D6686','2009-05-23','X',null,null,null,null union all
select 'D6686','2009-05-24','X',null,null,null,null union all
select 'D6686','2009-05-25','W','08:00:24','12:03:31','13:52:20','18:01:36' union all
select 'D6686','2009-05-26','W','08:00:24','12:03:31','13:52:20','18:01:36' union all
select 'D6686','2009-05-27','W','08:00:24','12:03:31','13:52:20','18:01:36' union all
select 'D6686','2009-05-28','F',null,null,null,null union all
select 'D6686','2009-05-29','W','08:00:24','12:03:31','13:52:20','18:01:36' union all
select 'D6686','2009-05-30','X',null,null,null,null union all
select 'D6686','2009-05-31','X',null,null,null,null union all
select 'D3686','2009-05-01','F',null,null,null,null union all
select 'D3686','2009-05-02','X',null,null,null,null union all
select 'D3686','2009-05-03','X',null,null,null,null union all
select 'D3686','2009-05-04','W','08:00:24','12:03:31','13:52:20','18:01:36' union all
select 'D3686','2009-05-05','W','08:00:24','12:03:31','13:52:20','18:01:36' union all
select 'D3686','2009-05-06','W','08:00:24','12:03:31','13:52:20','18:01:36' union all
select 'D3686','2009-05-07','W','08:00:24','12:03:31','13:52:20','18:01:36' union all
select 'D3686','2009-05-08','W','08:00:24','12:03:31','13:52:20','18:01:36' union all
select 'D3686','2009-05-09','X',null,null,null,null union all
select 'D3686','2009-05-10','X',null,null,null,null
--> 测试数据:fty_leave
if object_id('fty_leave') is not null
drop table fty_leave
create table fty_leave([mem_id,adate,nums] varchar(5),[C2] varchar(10),[C3] numeric(2,1))
insert into fty_leave
select 'D6686','2009-05-05',5 union all
select 'D6686','2009-05-12',3.5 union all
select 'D3686','2009-05-06',2.5
update fty_grkq
set [type]=k.[type],
[a1]=case when k.[type]='H' then [a1] end ,
[a2]=case when k.[type]='H' then [a2] end ,
[a3]=null,
[a4]=null
from fty_grkq join (
select [mem_id,adate,nums],dat,[type]=case when cast( C2 as datetime)+floor(C3)=dat then 'H' else 'X' end
from (
select [mem_id,adate,nums] ,cast( C2 as datetime)+number as dat,C3,C2
from fty_leave a , master..spt_values
where CEILING(C3)>number and type='p') z ) k
on fty_grkq.[mem_id]=k.[mem_id,adate,nums] and dat=fty_grkq.adate
select * from fty_grkq
/*
mem_id adate type a1 a2 a3 a4
------ ---------- ---- -------- -------- -------- --------
D6686 2009-05-01 F NULL NULL NULL NULL
D6686 2009-05-02 X NULL NULL NULL NULL
D6686 2009-05-03 X NULL NULL NULL NULL
D6686 2009-05-04 W 08:00:24 12:03:31 13:52:20 18:01:36
D6686 2009-05-05 X NULL NULL NULL NULL
D6686 2009-05-06 X NULL NULL NULL NULL
D6686 2009-05-07 X NULL NULL NULL NULL
D6686 2009-05-08 X NULL NULL NULL NULL
D6686 2009-05-09 X NULL NULL NULL NULL
D6686 2009-05-10 X NULL NULL NULL NULL
D6686 2009-05-11 W 08:00:24 12:03:31 13:52:20 18:01:36
D6686 2009-05-12 X NULL NULL NULL NULL
D6686 2009-05-13 X NULL NULL NULL NULL
D6686 2009-05-14 X NULL NULL NULL NULL
D6686 2009-05-15 H 08:00:24 12:03:31 NULL NULL
D6686 2009-05-16 X NULL NULL NULL NULL
D6686 2009-05-17 X NULL NULL NULL NULL
D6686 2009-05-18 W 08:00:24 12:03:31 13:52:20 18:01:36
D6686 2009-05-19 W 08:00:24 12:03:31 13:52:20 18:01:36
D6686 2009-05-20 W 08:00:24 12:03:31 13:52:20 18:01:36
D6686 2009-05-21 W 08:00:24 12:03:31 13:52:20 18:01:36
D6686 2009-05-22 W 08:00:24 12:03:31 13:52:20 18:01:36
D6686 2009-05-23 X NULL NULL NULL NULL
D6686 2009-05-24 X NULL NULL NULL NULL
D6686 2009-05-25 W 08:00:24 12:03:31 13:52:20 18:01:36
D6686 2009-05-26 W 08:00:24 12:03:31 13:52:20 18:01:36
D6686 2009-05-27 W 08:00:24 12:03:31 13:52:20 18:01:36
D6686 2009-05-28 F NULL NULL NULL NULL
D6686 2009-05-29 W 08:00:24 12:03:31 13:52:20 18:01:36
D6686 2009-05-30 X NULL NULL NULL NULL
D6686 2009-05-31 X NULL NULL NULL NULL
D3686 2009-05-01 F NULL NULL NULL NULL
D3686 2009-05-02 X NULL NULL NULL NULL
D3686 2009-05-03 X NULL NULL NULL NULL
D3686 2009-05-04 W 08:00:24 12:03:31 13:52:20 18:01:36
D3686 2009-05-05 W 08:00:24 12:03:31 13:52:20 18:01:36
D3686 2009-05-06 X NULL NULL NULL NULL
D3686 2009-05-07 X NULL NULL NULL NULL
D3686 2009-05-08 H 08:00:24 12:03:31 NULL NULL
D3686 2009-05-09 X NULL NULL NULL NULL
D3686 2009-05-10 X NULL NULL NULL NULL
*/
update fty_grkq
set [type]=k.[type],
[a1]=case when k.[type]='H' then [a1] end ,
[a2]=case when k.[type]='H' then [a2] end ,
[a3]=case when k.[type]='H' then [a3] end
from fty_grkq join (
select [mem_id,adate,nums],dat,[type]=case when cast( C2 as datetime)+floor(C3)=dat then 'H' else 'X' end
from (
select [mem_id,adate,nums] ,cast( C2 as datetime)+number as dat,C3,C2
from fty_leave a , master..spt_values
where CEILING(C3)>number and type='p') z ) k
on fty_grkq.[mem_id]=k.[mem_id,adate,nums] and dat=fty_grkq.adate
select * from fty_grkq
/*
mem_id adate type a1 a2 a3 a4
------ ---------- ---- -------- -------- -------- --------
D6686 2009-05-01 F NULL NULL NULL NULL
D6686 2009-05-02 X NULL NULL NULL NULL
D6686 2009-05-03 X NULL NULL NULL NULL
D6686 2009-05-04 W 08:00:24 12:03:31 13:52:20 18:01:36
D6686 2009-05-05 X NULL NULL NULL 18:01:36
D6686 2009-05-06 X NULL NULL NULL 18:01:36
D6686 2009-05-07 X NULL NULL NULL 18:01:36
D6686 2009-05-08 X NULL NULL NULL 18:01:36
D6686 2009-05-09 X NULL NULL NULL NULL
D6686 2009-05-10 X NULL NULL NULL NULL
D6686 2009-05-11 W 08:00:24 12:03:31 13:52:20 18:01:36
D6686 2009-05-12 X NULL NULL NULL 18:01:36
D6686 2009-05-13 X NULL NULL NULL 18:01:36
D6686 2009-05-14 X NULL NULL NULL 18:01:36
D6686 2009-05-15 H 08:00:24 12:03:31 13:52:20 18:01:36
D6686 2009-05-16 X NULL NULL NULL NULL
D6686 2009-05-17 X NULL NULL NULL NULL
D6686 2009-05-18 W 08:00:24 12:03:31 13:52:20 18:01:36
D6686 2009-05-19 W 08:00:24 12:03:31 13:52:20 18:01:36
D6686 2009-05-20 W 08:00:24 12:03:31 13:52:20 18:01:36
D6686 2009-05-21 W 08:00:24 12:03:31 13:52:20 18:01:36
D6686 2009-05-22 W 08:00:24 12:03:31 13:52:20 18:01:36
D6686 2009-05-23 X NULL NULL NULL NULL
D6686 2009-05-24 X NULL NULL NULL NULL
D6686 2009-05-25 W 08:00:24 12:03:31 13:52:20 18:01:36
D6686 2009-05-26 W 08:00:24 12:03:31 13:52:20 18:01:36
D6686 2009-05-27 W 08:00:24 12:03:31 13:52:20 18:01:36
D6686 2009-05-28 F NULL NULL NULL NULL
D6686 2009-05-29 W 08:00:24 12:03:31 13:52:20 18:01:36
D6686 2009-05-30 X NULL NULL NULL NULL
D6686 2009-05-31 X NULL NULL NULL NULL
D3686 2009-05-01 F NULL NULL NULL NULL
D3686 2009-05-02 X NULL NULL NULL NULL
D3686 2009-05-03 X NULL NULL NULL NULL
D3686 2009-05-04 W 08:00:24 12:03:31 13:52:20 18:01:36
D3686 2009-05-05 W 08:00:24 12:03:31 13:52:20 18:01:36
D3686 2009-05-06 X NULL NULL NULL 18:01:36
D3686 2009-05-07 X NULL NULL NULL 18:01:36
D3686 2009-05-08 H 08:00:24 12:03:31 13:52:20 18:01:36
D3686 2009-05-09 X NULL NULL NULL NULL
D3686 2009-05-10 X NULL NULL NULL NULL
(41 行受影响)
*/
KEN WONG
--> 测试数据:fty_grkq
if object_id('fty_grkq') is not null
drop table fty_grkq
create table fty_grkq ([mem_id] varchar(5),[adate] varchar(10),[type] varchar(1),
[a1] varchar(8),[a2] varchar(8),[a3] varchar(8),[a4] varchar(8))
insert into fty_grkq
select 'D6686','2009-05-01','F',null,null,null,null union all
select 'D6686','2009-05-02','X',null,null,null,null union all
select 'D6686','2009-05-03','X',null,null,null,null union all
select 'D6686','2009-05-04','W','08:00:24','12:03:31','13:52:20','18:01:36' union all
select 'D6686','2009-05-05','W','08:00:24','12:03:31','13:52:20','18:01:36' union all
select 'D6686','2009-05-06','W','08:00:24','12:03:31','13:52:20','18:01:36' union all
select 'D6686','2009-05-07','W','08:00:24','12:03:31','13:52:20','18:01:36' union all
select 'D6686','2009-05-08','W','08:00:24','12:03:31','13:52:20','18:01:36' union all
select 'D6686','2009-05-09','X',null,null,null,null union all
select 'D6686','2009-05-10','X',null,null,null,null union all
select 'D6686','2009-05-11','W','08:00:24','12:03:31','13:52:20','18:01:36' union all
select 'D6686','2009-05-12','W','08:00:24','12:03:31','13:52:20','18:01:36' union all
select 'D6686','2009-05-13','W','08:00:24','12:03:31','13:52:20','18:01:36' union all
select 'D6686','2009-05-14','W','08:00:24','12:03:31','13:52:20','18:01:36' union all
select 'D6686','2009-05-15','W','08:00:24','12:03:31','13:52:20','18:01:36' union all
select 'D6686','2009-05-16','X',null,null,null,null union all
select 'D6686','2009-05-17','X',null,null,null,null union all
select 'D6686','2009-05-18','W','08:00:24','12:03:31','13:52:20','18:01:36' union all
select 'D6686','2009-05-19','W','08:00:24','12:03:31','13:52:20','18:01:36' union all
select 'D6686','2009-05-20','W','08:00:24','12:03:31','13:52:20','18:01:36' union all
select 'D6686','2009-05-21','W','08:00:24','12:03:31','13:52:20','18:01:36' union all
select 'D6686','2009-05-22','W','08:00:24','12:03:31','13:52:20','18:01:36' union all
select 'D6686','2009-05-23','X',null,null,null,null union all
select 'D6686','2009-05-24','X',null,null,null,null union all
select 'D6686','2009-05-25','W','08:00:24','12:03:31','13:52:20','18:01:36' union all
select 'D6686','2009-05-26','W','08:00:24','12:03:31','13:52:20','18:01:36' union all
select 'D6686','2009-05-27','W','08:00:24','12:03:31','13:52:20','18:01:36' union all
select 'D6686','2009-05-28','F',null,null,null,null union all
select 'D6686','2009-05-29','W','08:00:24','12:03:31','13:52:20','18:01:36' union all
select 'D6686','2009-05-30','X',null,null,null,null union all
select 'D6686','2009-05-31','X',null,null,null,null union all
select 'D3686','2009-05-01','F',null,null,null,null union all
select 'D3686','2009-05-02','X',null,null,null,null union all
select 'D3686','2009-05-03','X',null,null,null,null union all
select 'D3686','2009-05-04','W','08:00:24','12:03:31','13:52:20','18:01:36' union all
select 'D3686','2009-05-05','W','08:00:24','12:03:31','13:52:20','18:01:36' union all
select 'D3686','2009-05-06','W','08:00:24','12:03:31','13:52:20','18:01:36' union all
select 'D3686','2009-05-07','W','08:00:24','12:03:31','13:52:20','18:01:36' union all
select 'D3686','2009-05-08','W','08:00:24','12:03:31','13:52:20','18:01:36' union all
select 'D3686','2009-05-09','X',null,null,null,null union all
select 'D3686','2009-05-10','X',null,null,null,null
--> 测试数据:fty_leave
if object_id('fty_leave') is not null
drop table fty_leave
create table fty_leave([mem_id] varchar(5),[adate] varchar(10),[nums] numeric(2,1))
insert into fty_leave
select 'D6686','2009-05-05',5 union all
select 'D6686','2009-05-12',3.5 union all
select 'D3686','2009-05-06',2.5
--执行
update fty_grkq set
type = case t.type when 'W' then case r.nums when 0 then 'J' else 'H' end else t.type end,
a1= case t.type when 'W' then case r.nums when 0 then null else t.a1 end else t.a1 end,
a2= case t.type when 'W' then case r.nums when 0 then null else t.a1 end else t.a2 end,
a3= case t.type when 'W' then null else t.a3 end,
a4= case t.type when 'W' then null else t.a4 end
from fty_grkq as t,(select b.mem_id,b.adate,
case b.adate when convert(varchar(10),dateadd(day,ceiling(a.nums)-1,a.adate),120) then ceiling(nums) - nums else 0 end as nums
from fty_leave a ,fty_grkq b
where left(a.adate,7) = left(b.adate,7)
and a.mem_id = b.mem_id
and left(a.adate,7) = '2009-05'
and b.adate <= convert(varchar(10),dateadd(day,ceiling(a.nums) - 1,a.adate),120)
and b.adate >= a.adate) r
where t.adate = r.adate and t.mem_id = r.mem_id
--结果
select * from fty_grkq
------------------------------------------
D6686 2009-05-01 F NULL NULL NULL NULL
D6686 2009-05-02 X NULL NULL NULL NULL
D6686 2009-05-03 X NULL NULL NULL NULL
D6686 2009-05-04 W 08:00:24 12:03:31 13:52:20 18:01:36
D6686 2009-05-05 J NULL NULL NULL NULL
D6686 2009-05-06 J NULL NULL NULL NULL
D6686 2009-05-07 J NULL NULL NULL NULL
D6686 2009-05-08 J NULL NULL NULL NULL
D6686 2009-05-09 X NULL NULL NULL NULL
D6686 2009-05-10 X NULL NULL NULL NULL
D6686 2009-05-11 W 08:00:24 12:03:31 13:52:20 18:01:36
D6686 2009-05-12 J NULL NULL NULL NULL
D6686 2009-05-13 J NULL NULL NULL NULL
D6686 2009-05-14 J NULL NULL NULL NULL
D6686 2009-05-15 H 08:00:24 08:00:24 NULL NULL
D6686 2009-05-16 X NULL NULL NULL NULL
D6686 2009-05-17 X NULL NULL NULL NULL
D6686 2009-05-18 W 08:00:24 12:03:31 13:52:20 18:01:36
D6686 2009-05-19 W 08:00:24 12:03:31 13:52:20 18:01:36
D6686 2009-05-20 W 08:00:24 12:03:31 13:52:20 18:01:36
D6686 2009-05-21 W 08:00:24 12:03:31 13:52:20 18:01:36
D6686 2009-05-22 W 08:00:24 12:03:31 13:52:20 18:01:36
D6686 2009-05-23 X NULL NULL NULL NULL
D6686 2009-05-24 X NULL NULL NULL NULL
D6686 2009-05-25 W 08:00:24 12:03:31 13:52:20 18:01:36
D6686 2009-05-26 W 08:00:24 12:03:31 13:52:20 18:01:36
D6686 2009-05-27 W 08:00:24 12:03:31 13:52:20 18:01:36
D6686 2009-05-28 F NULL NULL NULL NULL
D6686 2009-05-29 W 08:00:24 12:03:31 13:52:20 18:01:36
D6686 2009-05-30 X NULL NULL NULL NULL
D6686 2009-05-31 X NULL NULL NULL NULL
D3686 2009-05-01 F NULL NULL NULL NULL
D3686 2009-05-02 X NULL NULL NULL NULL
D3686 2009-05-03 X NULL NULL NULL NULL
D3686 2009-05-04 W 08:00:24 12:03:31 13:52:20 18:01:36
D3686 2009-05-05 W 08:00:24 12:03:31 13:52:20 18:01:36
D3686 2009-05-06 J NULL NULL NULL NULL
D3686 2009-05-07 J NULL NULL NULL NULL
D3686 2009-05-08 H 08:00:24 08:00:24 NULL NULL
D3686 2009-05-09 X NULL NULL NULL NULL
D3686 2009-05-10 X NULL NULL NULL NULL