第一张表
--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 记录完整匹配不做处理难点在于..每个人的最后一条记录不固定.....弄了一个多小时,不行...大牛们 给个办法吧..

解决方案 »

  1.   

    select 
    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
      

  2.   

    主要你所说的不匹配都是out没有数值,所以就从out2开始判断,直到out8.我假设in_or_out 是varchar类型,如果不是,请用cast(in_or_out as varchar)declare @in_or_out varchar
    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
      

  3.   

    --> --> (Roy)生成測試數據
     
    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
    */
      

  4.   

    --第二张表 打卡记录表
    --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*/
      

  5.   

    use tempdb
    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
    */
      

  6.   

    --如果表1的in1不为null时,可用加上同一天的记录做为判断use tempdb
    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
    */
      

  7.   

    数据量大时改为max
    declare @sql nvarchar(max)