第一张表
--emp_id--in1--out1--in2--out2--in3--out3--in4--out4--in5--out5--in6--out6--in7--out7--in8--out8--last_inorout1 in1=2011-11-09 08:00 ou1=2011-11-09 12:00 in2=2011-11-09 13:00 nul nul null null null null null null 00202 in1=2011-11-09 08:00 ou1=null in2=2011-11-09 13:00 null in3=2011-11-09 20:00 null null null null null 00303 in1=2011-11-09 08:00 ou1=null null null null null null null null null null 00104 in1=2011-11-09 08:00 ou1=2011-11-09 18:00 null null null null null null null null null null 0011last_inorout 该人的有记录的最后一条记录是in几或out几
比如
emp_id=1 的0020 该人的最后一条记录是in2
emp_id=4 的0011 代表该人最后一条记录是out1
第二张表 打卡记录表
--emp_id--emp_datetime--in_or_out---
---1------2011-11-09:19:00---out-----1------2011-11-09:21:00---in-----1------2011-11-09:23:00---out-----2------2011-11-09:21:00---out-----3------2011-11-09:19:00---in-----3------2011-11-09:21:00---out-----4------2011-11-09:21:00---out--
要批量更新第一张表的所有人最后一条记录为进的
比如
emp_id=1 out2没有值要将第二张表中的emp_id 为1的所有记录以时间升序 top 1 如果为out,则将该时间更新到第一张表emp_id=4,in 好和out 记录完整匹配不做处理难点在于..每个人的最后一条记录不固定.....弄了一个多小时,不行...大牛们 给个办法吧..
emp_id,emp_datetime,left(in_or_out,len(in_or_out )-1)
from tb
unpivot
(emp_datetime for in_or_out in([in1],[out1],[in2],[out2],[in3],[out3],[in4],[out4],[in5],[out5],[in6],[out6],[in7],[out7],[in8],[out8])) as b
if(out2 is null)
begin
set @in_or_out = (select top 1 in_or_out from tb2 where emp_id=1 order by emp_datetime)
update tb1 set out2='out2='+cast((select top 1 emp_datetim from tb2 order by emp_datetime) as varchar) where @in_or_out ='out'
endif(out3 is null)
begin
set @in_or_out = (select top 1 in_or_out from tb2 where emp_id=2 order by emp_datetime)
update tb1 set out3='out3='+cast((select top 1 emp_datetim from tb2 order by emp_datetime) as varchar) where @in_or_out ='out'
endif(out4 is null)
begin
set @in_or_out = (select top 1 in_or_out from tb2 where emp_id=3 order by emp_datetime)
update tb1 set out4='out4='+cast((select top 1 emp_datetim from tb2 order by emp_datetime) as varchar) where @in_or_out ='out'
endif(out5 is null)
begin
set @in_or_out = (select top 1 in_or_out from tb2 where emp_id=4 order by emp_datetime)
update tb1 set out5='out5='+cast((select top 1 emp_datetim from tb2 order by emp_datetime) as varchar) where @in_or_out ='out'
endif(out6 is null)
begin
set @in_or_out = (select top 1 in_or_out from tb2 where emp_id=5 order by emp_datetime)
update tb1 set out6='out6='+cast((select top 1 emp_datetim from tb2 order by emp_datetime) as varchar) where @in_or_out ='out'
endif(out7 is null)
begin
set @in_or_out = (select top 1 in_or_out from tb2 where emp_id=6 order by emp_datetime)
update tb1 set out7='out7='+cast((select top 1 emp_datetim from tb2 order by emp_datetime) as varchar) where @in_or_out ='out'
endif(out8 is null)
begin
set @in_or_out = (select top 1 in_or_out from tb2 where emp_id=7 order by emp_datetime)
update tb1 set out8='out8='+cast((select top 1 emp_datetim from tb2 order by emp_datetime) as varchar) where @in_or_out ='out'
end
if not object_id('Tempdb..#T1') is null
drop table #T1
Go
Create table #T1([emp_id] int,[in1] Datetime,[out1] Datetime,[in2] Datetime,[out2] datetime,[in3] Datetime,[out3] Datetime,[in4] Datetime,[out4] Datetime,[in5] Datetime,[out5] Datetime,[in6] datetime,[out6] datetime,[in7] datetime,[out7] datetime, in8 datetime, out8 datetime, last_inorou nvarchar(10))
Insert #T1
select 1,'2011-11-09 08:00','2011-11-09 12:00','2011-11-09 13:00',null,null,null,null,null,null,null,null,null,null,null,null,null,N'002' union all
select 2,'2011-11-09 08:00',null,'2011-11-09 13:00',null,'2011-11-09 20:00',null,null,null,null,null,null,null,null,null,null,null,N'0030' union all
select 3,'2011-11-09 08:00',null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,N'0010' union all
select 4,'2011-11-09 08:00','2011-11-09 18:00',null,null,null,null,null,null,null,null,null,null,null,null,null,null,N'0011'
Goselect
emp_id,emp_datetime,left(in_or_out,len(in_or_out )-1) as in_or_out
from #T1
unpivot
(emp_datetime for in_or_out in([in1],[out1],[in2],[out2],[in3],[out3],[in4],[out4],[in5],[out5],[in6],[out6],[in7],[out7],[in8],[out8])) as b/*
emp_id emp_datetime in_or_out
1 2011-11-09 08:00:00.000 in
1 2011-11-09 12:00:00.000 out
1 2011-11-09 13:00:00.000 in
2 2011-11-09 08:00:00.000 in
2 2011-11-09 13:00:00.000 in
2 2011-11-09 20:00:00.000 in
3 2011-11-09 08:00:00.000 in
4 2011-11-09 08:00:00.000 in
4 2011-11-09 18:00:00.000 out
*/
--emp_id--emp_datetime--in_or_out---
---1------2011-11-09:19:00---out-----1------2011-11-09:21:00---in-----1------2011-11-09:23:00---out-----2------2011-11-09:21:00---out-----3------2011-11-09:19:00---in-----3------2011-11-09:21:00---out-----4------2011-11-09:21:00---out--
/*
原数据
1 2011-11-09 08:00:00.000 2011-11-09 12:00:00.000 2011-11-09 13:00:00 [NULL] NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 002
2 2011-11-09 08:00:00.000 NULL 2011-11-09 13:00:00.000 NULL 2011-11-09 20:00:00.000 [NULL] NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 0030
3 2011-11-09 08:00:00.000 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 0010
4 2011-11-09 08:00:00.000 2011-11-09 18:00:00.000 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 0011*//*
修改后的数据
1 2011-11-09 08:00:00.000 2011-11-09 12:00:00.000 2011-11-09 13:00:00 [2011-11-09:19:00] NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 002
2 2011-11-09 08:00:00.000 NULL 2011-11-09 13:00:00.000 NULL 2011-11-09 20:00:00.000 [2011-11-09:21:00] NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 0030
3 2011-11-09 08:00:00.000 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 0010
4 2011-11-09 08:00:00.000 2011-11-09 18:00:00.000 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 0011*/
go
set nocount on ;
if not object_id('Tempdb..#T1') is null
drop table #T1
Go
Create table #T1([emp_id] int,[in1] Datetime,[out1] Datetime,[in2] Datetime,[out2] datetime,[in3] Datetime,[out3] Datetime,[in4] Datetime,[out4] Datetime,[in5] Datetime,[out5] Datetime,[in6] datetime,[out6] datetime,[in7] datetime,[out7] datetime, in8 datetime, out8 datetime, last_inorou nvarchar(10))
Insert #T1select 1, '2011-11-09 08:00:00.000', '2011-11-09 12:00:00.000', '2011-11-09 13:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '002' union all
select 2, '2011-11-09 08:00:00.000', NULL, '2011-11-09 13:00:00.000', NULL, '2011-11-09 20:00:00.000', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '0030' union all
select 3, '2011-11-09 08:00:00.000', NULL, NULL, NULL, NULL, NULL, NULL , NULL , NULL , NULL, NULL , NULL, NULL, NULL, NULL, NULL, '0010' union all
select 4, '2011-11-09 08:00:00.000', '2011-11-09 18:00:00.000', NULL, NULL, NULL ,NULL , NULL , NULL , NULL , NULL, NULL, NULL, NULL, NULL, NULL, NULL, '0011'
go--> --> (Roy)生成測試數據
if not object_id('Tempdb..#T2') is null
drop table #T2
Go
Create table #T2([emp_id] int,[emp_datetime] Datetime,[in_or_out] nvarchar(3))
Insert #T2
select 1,'2011-11-09 19:00',N'out' union all
select 1,'2011-11-09 21:00',N'in' union all
select 1,'2011-11-09 23:00',N'out' union all
select 2,'2011-11-09 21:00',N'out' union all
select 3,'2011-11-09 19:00',N'in' union all
select 3,'2011-11-09 21:00',N'out' union all
select 4,'2011-11-09 21:00',N'out'
Go
declare @sql nvarchar(2000)
set @sql=''
;with a
as
(
select
emp_id,emp_datetime,in_or_out
from #T1
unpivot
(emp_datetime for in_or_out in([in1],[out1],[in2],[out2],[in3],[out3],[in4],[out4],[in5],[out5],[in6],[out6],[in7],[out7],[in8],[out8])) as b
),a2
as
(
select * from a as b where not exists(select 1 from a where emp_id=b.emp_id and emp_datetime>b.emp_datetime) and in_or_out like 'in_'
),b
as
(select * from #T2 as b where not exists(select 1 from #T2 where emp_id=b.emp_id and emp_datetime<b.emp_datetime) and [in_or_out] like 'out')select @sql=@sql+'update #T1 set [out'+RIGHT(a.in_or_out,1)+']='''+CONVERT(varchar(30),MIN(b.emp_datetime),121)+''' where emp_id='+RTRIM(a.emp_id)+';'
from a2 as a, b
where b.emp_datetime>a.emp_datetime and a.emp_id=b.emp_id
group by a.emp_id,a.in_or_out
--print @sql 显示生成脚本
exec(@sql)
go
select * from #T1--查看
/*
emp_id in1 out1 in2 out2 in3 out3 in4 out4 in5 out5 in6 out6 in7 out7 in8 out8 last_inorou
1 2011-11-09 08:00:00.000 2011-11-09 12:00:00.000 2011-11-09 13:00:00.000 2011-11-09 19:00:00.000 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 002
2 2011-11-09 08:00:00.000 NULL 2011-11-09 13:00:00.000 NULL 2011-11-09 20:00:00.000 2011-11-09 21:00:00.000 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 0030
3 2011-11-09 08:00:00.000 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 0010
4 2011-11-09 08:00:00.000 2011-11-09 18:00:00.000 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 0011
*/
go
set nocount on ;
if not object_id('Tempdb..#T1') is null
drop table #T1
Go
Create table #T1([emp_id] int,[in1] Datetime,[out1] Datetime,[in2] Datetime,[out2] datetime,[in3] Datetime,[out3] Datetime,[in4] Datetime,[out4] Datetime,[in5] Datetime,[out5] Datetime,[in6] datetime,[out6] datetime,[in7] datetime,[out7] datetime, in8 datetime, out8 datetime, last_inorou nvarchar(10))
Insert #T1select 1, '2011-11-09 08:00:00.000', '2011-11-09 12:00:00.000', '2011-11-09 13:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '002' union all
select 2, '2011-11-09 08:00:00.000', NULL, '2011-11-09 13:00:00.000', NULL, '2011-11-09 20:00:00.000', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '0030' union all
select 3, '2011-11-09 08:00:00.000', NULL, NULL, NULL, NULL, NULL, NULL , NULL , NULL , NULL, NULL , NULL, NULL, NULL, NULL, NULL, '0010' union all
select 4, '2011-11-09 08:00:00.000', '2011-11-09 18:00:00.000', NULL, NULL, NULL ,NULL , NULL , NULL , NULL , NULL, NULL, NULL, NULL, NULL, NULL, NULL, '0011'
go--> --> (Roy)生成測試數據
if not object_id('Tempdb..#T2') is null
drop table #T2
Go
Create table #T2([emp_id] int,[emp_datetime] Datetime,[in_or_out] nvarchar(3))
Insert #T2
select 1,'2011-11-09 19:00',N'out' union all
select 1,'2011-11-09 21:00',N'in' union all
select 1,'2011-11-09 23:00',N'out' union all
select 2,'2011-11-09 21:00',N'out' union all
select 3,'2011-11-09 19:00',N'in' union all
select 3,'2011-11-09 21:00',N'out' union all
select 4,'2011-11-09 21:00',N'out'
Go
declare @sql nvarchar(2000)
set @sql=''
;with a
as
(
select
emp_id,emp_datetime,in_or_out
from #T1
unpivot
(emp_datetime for in_or_out in([in1],[out1],[in2],[out2],[in3],[out3],[in4],[out4],[in5],[out5],[in6],[out6],[in7],[out7],[in8],[out8])) as b
),a2
as
(
select * from a as b where not exists(select 1 from a where emp_id=b.emp_id and emp_datetime>b.emp_datetime) and in_or_out like 'in_'
),b
as
(select * from #T2 as b where not exists(select 1 from #T2 where emp_id=b.emp_id and emp_datetime<b.emp_datetime) and [in_or_out] like 'out')select @sql=@sql+'update #T1 set [out'+RIGHT(a.in_or_out,1)+']='''+CONVERT(varchar(30),MIN(b.emp_datetime),121)+''' where emp_id='+RTRIM(a.emp_id)+' and convert(varchar(10),[in1],120)='''+CONVERT(varchar(10),MIN(b.emp_datetime),120)+''';'
from a2 as a, b
where b.emp_datetime>a.emp_datetime and a.emp_id=b.emp_id and convert(varchar(10),b.emp_datetime,120)=convert(varchar(10),a.emp_datetime,120)
group by a.emp_id,a.in_or_out
--print @sql --显示生成脚本exec(@sql)
go
select * from #T1--查看
/*
emp_id in1 out1 in2 out2 in3 out3 in4 out4 in5 out5 in6 out6 in7 out7 in8 out8 last_inorou
1 2011-11-09 08:00:00.000 2011-11-09 12:00:00.000 2011-11-09 13:00:00.000 2011-11-09 19:00:00.000 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 002
2 2011-11-09 08:00:00.000 NULL 2011-11-09 13:00:00.000 NULL 2011-11-09 20:00:00.000 2011-11-09 21:00:00.000 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 0030
3 2011-11-09 08:00:00.000 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 0010
4 2011-11-09 08:00:00.000 2011-11-09 18:00:00.000 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 0011
*/
declare @sql nvarchar(max)