如何循环表变​​量进行特定的计算?

时间:2015-04-08 09:02:11

标签: sql sql-server sql-server-2012 table-variable

如果我有一个表变量,那么如何循环这个var来进行一些处理:

DECLARE @userData TABLE(
                                    userId int NOT NULL,
                                    dayDate datetime NOT NULL,
                                    transIn datetime NULL,
                                    transOut datetime NULL,
                                    attIn datetime NULL,
                                    attOut datetime NULL,
                                    MissionIn datetime NOT NULL,
                                    MissionOut datetime NOT NULL,
                                    empState varchar(10) NULL
                                   );


                INSERT INTO @userData
                SELECT userid, trans_date,transtime_in,transtime_out,att_start_time,att_end_time,@Mission_fromdatetime,@Mission_todatetime,day_flag
                FROM datatable_o a
                WHERE a.userid = @userid AND a.trans_date = @date ORDER BY  transtime_in ;

根据整个案例的评论:

如果作品从:att_start_time开始,到att_end_time结束(工作期间)

每位员工都可以在同一天检查和退房多次,以便我们跟随他。 存入transtime_in的办理登机手续 和签出存储在transtime_out

我有day_flag所以我知道这一天是' W'工作日或' E'周末

现在考虑除emp_num ,date

之外的所有这些信息

我想为员工External mission over time计算:

我有四个案例:

  1. 没有登记入住&&不工作的一天[周末]所以员工 应该将所有任务期间视为加班
  2. 没有登记入住&&工作日[缺席]所以员工应该这样做 只采取工作期间的任务期
  3. 有办理登机手续和&&不工作的一天[周结束]所以 员工应该只采取这些任务期限 签到奏
  4. 有办理登机手续和&&工作日所以员工应该采取 只有这些签出的任务期间和同一时期 超出工作时间。
  5. 示例:

    emp_num     date         att_start   att_end    mission-in  mission-out
      672      2015-3-4       07:05:00    13:30:00   12:12:00    20:00:00
    

    emp_num      date         trans_in     trans_out 
    
     672       2015-3-4       06:54:00     11:10:00
     672       2015-3-4       12:00:00     14:05:00
    

1 个答案:

答案 0 :(得分:1)

您可以从该表的副本中获取帮助来遍历您的表格:

关于你的问题假设你的表是:

DECLARE @userData TABLE(
                         userId int NOT NULL,
                         /*Other fields*/
                        );

并且您的表格数据是:

INSERT INTO @userData
/*A SELECT or values*/

现在创建一个表格副本:

DECLARE @userData_2 TABLE(
                         userId int NOT NULL,
                         /*Structure should be the same as @userData*/
                        );
INSERT INTO @userData_2
SELECT * FROM  @userData

现在你可以做循环并做任何你想做的事情:

DECLARE @userId INT
WHILE EXISTS (SELECT * FROM @userData_2)
BEGIN
SET @userId=(SELECT TOP 1 userId FROM @userData)
/*

DO YOUR TRANSACTION HERE

*/
DELETE FROM @userData_2 WHERE userId=@userID
END

注意:这假设userId是唯一的,如果没有,那么您需要具有唯一字段,或使用复合字段而不是userId。