2012-02-18 2 views
0

У меня есть три таблицы в моей базе данных.Временная сумма подобных сотрудников в запросе SQL Server

Первая таблица Employee:

enter image description here

Вторая таблица EmployeeTimeIn: (HoursConsumed есть время в секундах!)

Третья таблица EmployeeTimeOut:

enter image description here

Я написал следующий SQL запрос, который содержит список всех сотрудников, сгруппированных по их идентификаторам и рабочего времени каждый раз, когда в сессии:

select 
    v.EID, e.EmployeeName, v.Time_In, v.Time_Out, 
    convert(varchar(5), SUM(v.HoursConsumed)/3600) + ':' + 
    convert(varchar(5), SUM(v.HoursConsumed) % 3600/60) + ':' + 
    convert(varchar(5), (SUM(v.HoursConsumed) % 60)) as workingtime, 
    v.Date_Ref 
from 
    (select 
     e1.EID, e1.Time_In, e2.Time_Out, e1.HoursConsumed,  
     CONVERT(VARCHAR(10), e1.Date_Ref, 111) as Date_Ref 
    from EmployeeTimeIn as e1, EmployeeTimeOut as e2 
    where e1.Refid = e2.Refid) as v, Employee as e 
    where v.EID = e.EmployeeID 
    group by 
      v.EID, e.EmployeeName, v.Time_In, v.Time_Out, v.HoursConsumed, v.Date_Ref; 

Он производит следующий вывод:

enter image description here

Мне нужно изменить этот запрос, чтобы каждый сотрудник показывал общее общее время работы в столбце workingtime. В этом случае он отобразит workingtime из 0:41:53 для EID 4 и 0: 0: 39 для EID 200.

Просьба сообщить.

(Примечание: окончательный вывод должен иметь три строки для этого примера данных, так как мне нужно, чтобы показать время В и Time Out поле в итоговой таблице тоже!)

+3

Пожалуйста, используйте явное JOIN и вместо «таблицы, таблицы» синтаксиса. – pilcrow

+0

Hi @Nida Sulheri Я столкнулся с той же проблемой. Можете ли вы предоставить мне структуру таблицы или использовать ее, мне нужно реализовать ту же логику в моем проекте. С уважением –

+1

@ A.Goutam Структуры таблиц указаны в моем вышеприведенном сообщении ... Пожалуйста, обратитесь к скриншотам таблиц. – Azeem

ответ

2

Я предполагаю, что вы всегда можете конвертировать WorkingTimeInSeconds часам:

;WITH Totals(WorkingTimeInSeconds, EmployeeId, EmployeeName, DateRef) AS 
(
    SELECT 
     e.EmployeeId, 
     e.EmployeeName, 
     eti.Date_Refб 
     SUM(HoursConsumed) WorkingTimeInSeconds, 
    FROM Employee e 
    JOIN EmployeeTimeIn eti 
     ON e.EmployeeId = eti.EId 
    GROUP BY 
     e.EmployeeId, 
     e.EmployeeName, 
     eti.Date_Ref 
) 

SELECT 
    Totals.EmployeeId, 
    Totals.EmployeeName, 
    eti.Time_In, 
    eto.Time_Out, 
    eti.Ref_Date, 
    eti.WorkingTimeInSeconds 
FROM Totals 
JOIN EmployeeTimeIn eti 
    ON Totals.DateRef = eti.Date_Ref AND eti.EID=Totals.EmployeeId 
JOIN EmployeeTimeOut eto 
    ON Totals.DateRef = eto.Date_Ref AND eto.EID=Totals.EmployeeId AND eti.RefId = eto.RefId 
+0

Этот запрос работает, но он показывает только две строки. Не могли бы вы прочитать ПРИМЕЧАНИЕ в моем посте, которое я только что добавил !!! – Azeem

+0

@NidaSulheri Обновленный ответ. –

+0

Спасибо за ваш ответ. SQL Server показывает ошибку в некоторых точках вашего предоставленного запроса. Загрузите БД и посмотрите, что вы можете сделать, чтобы исправить это ... http://www.mediafire.com/?ia0ljcvg99200vp – Azeem

0

Вы можете обработать текущие результаты запроса как четвертые таблицу, а затем сделайте выделенную сумму. Конечно, вам нужно будет сохранить значения вашего исходного запроса в числовых значениях, но я не уверен, сколько часов потребляет.

select EmployeeName, sum(workingtime), date_ref 
from (
-- original query but modified to not convert strings 
select  v.EID,e.EmployeeName,v.Time_In,v.Time_Out,convert(varchar(5),SUM(v.HoursConsumed)/3600)+':'+convert(varchar(5),SUM(v.HoursConsumed)%3600/60)+':'+convert(varchar(5),(SUM(v.HoursConsumed)%60)) as workingtime,v.Date_Ref 
from ... 
) group by EmployeeName, date_ref 

Вы также можете тянуть расчет времени из в функцию, чтобы получить часы работником и дату, но не уверены в своих данных. Надеюсь, эта помощь.

+0

Hi, HoursConsumed имеют время в секундах. Не могли бы вы вставить полный запрос, потому что я не понял, что вы подразумеваете под «исходным запросом, но измененным, чтобы не преобразовать строки» ... спасибо – Azeem

+0

Пожалуйста, обратитесь к ПРИМЕЧАНИЕ в моем сообщении, которое я только что добавил! – Azeem

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