从另一个表中将值插入表中

时间:2016-08-19 10:12:56

标签: sql sql-server

我有一张表AttendanceLog

列是:

  • EmpCode
  • Date
  • time
  • type

这是出席打卡详情

empcode date           time      type
01      19.08.2016     080530    64
01      19.08.2016     092030    64
01      19.08.2016     084030    65

64的类型为Intime65outtime

我有另一张桌子。

列是

  • Empcode
  • Date
  • Intime
  • outtime

现在我想从attendancelog表插入此表。 根据类型,我必须将time插入特定的intimeouttime列。

请员工填写firstIntimelastouttime

我的程序:

CREATE PROCEDURE [dbo].[Attendance]
AS
BEGIN

SET NOCOUNT ON

Declare @Empcode varchar(50),
        @Date varchar(50),
        @time varchar(10),
        @type varchar(10)

  Declare attcursor Cursor
  for
  select AC.AttEmpCode,AttDate,AttTime,AttType
  from BGUsersAttendanceCode AC inner join BGAttendanceTempTable AT 
       on AC.AttEmpCode=AT.AttEmpCode 
       order by AttType,AttDate

       open attcursor

       fetch next from attcursor into
       @Empcode, @Date, @time, @type

       WHILE @@FETCH_STATUS = 0
       begin

       insert into BGUsersAttendanceLog values(@Empcode,@Date,@time,@time)

       fetch next from attcursor into
       @Empcode, @Date, @time, @type

       end

          CLOSE attcursor
      DEALLOCATE attcursor

END
GO

1 个答案:

答案 0 :(得分:0)

我对您的要求的解释

  • 您希望合并attendance表格中的行,以便每个(empcode, date)组合最终只有一行。

  • 对于每个此类行,如果InTime组合存在多个InTime列,则您希望使用最早的(empcode, date)值填充新的OutTime列。

  • 同样,如果OutTime组合存在多个(empcode, date)值,您希望新的varchar列填充最新datetime值。

一些额外的说明

  • 我注意到您为所有列使用int数据类型。那真不幸。如果可能,您确实应该使用适当的类型(varcharattendance等)。但我会忽略这一点,并假设您保留create table OldAttendanceLog ( AttEmpCode varchar(50), AttDate varchar(50), AttTime varchar(10), AttType varchar(10) ) insert into OldAttendanceLog (AttEmpCode, AttDate, AttTime, AttType) values ('01', '19.08.2016', '080530', '64'), ('01', '19.08.2016', '092030', '64'), ('01', '19.08.2016', '084030', '65'), create table NewAttendanceLog ( AttEmpCode varchar(50), AttDate varchar(50), InTime varchar(10), OutTime varchar(10) ) 值。

  • 在您的说明中,您说您有一个insert into NewAttendanceLog (AttEmpCode, AttDate, InTime, OutTime) select AttEmpCode, AttDate, min(case when AttType = '64' then AttTime end), max(case when AttType = '65' then AttTime end) from OldAttendanceLog group by AttEmpCode, AttDate 源表。但是您的SP代码表明您的源数据来自2个表之间的连接。由于您没有详细描述,我将坚持您对单个源表的描述。您可以根据需要进行调整。

<强>设置

(function( $ ){     
   var navOffset = jQuery("nav").offset().top; 
   jQuery(window).scroll(function() {
       var scrollPos = jQuery(window).scrollTop();
        if (scrollPos >= navOffset) {
            jQuery("nav").addClass("fixed");
        } else {
            jQuery("nav").removeClass("fixed");
        }
    });
})(jQuery);

INSERT语句

您不需要所有复杂的游标代码。插入可以使用条件聚合在单个语句中完成:

.fixed