2015-04-08 31 views
1

如果我有一個這樣的表變量如何循環該變種進行一些處理:如何遍歷表變量以進行特定的計算?

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. 有檢查出來s & &工作日所以員工應該只從中抽出這些退房時間和在工作時間外的相同時間。

例子:

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 
+3

你想要做什麼樣的處理? SQL通常不喜歡循環。將數據作爲一組處理更好。如果您提供更多細節,可以避免使用循環,從而提高查詢結果的性能。 – Aidan

+0

你也應該知道表本質上沒有秩序。由於在'SELECT'查詢中沒有執行任何限制(例如'TOP'或'FETCH'子句),所以'ORDER BY'完全沒有意義。 –

+0

@Aidan我想計算並插入另一個表 –

回答

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 [email protected] 
END 

通知:這假設userId是唯一的,如果不是,那麼你需要有一個唯一的字段,或使用複合字段,而不是userId。