2015-04-08 1 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.

Смежные вопросы