SQL Server查询中类似员工的时间总和

时间:2012-02-18 17:08:43

标签: sql sql-server-2008

我的数据库中有三个表。

第一个表格是Employee

enter image description here

第二个表是EmployeeTimeIn :( HoursConsumed有几秒钟的时间!)

enter image description here

第三个表格是EmployeeTimeOut

enter image description here

我编写了以下SQL查询,其中列出了按会员ID和每次会议工作时间分组的所有员工:

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列中的总工作时间。在这种情况下,对于EID 4,它将显示workingtime 0:41:53,对于EID 200,它将显示0:0:39。

请告知。

(注意:此示例数据的最终输出应该有三行,因为我还需要在最终表中显示Time In和Time Out字段!)

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

您还可以将时间计算拉出到一个函数中,以便按员工和日期计算小时数,但不确定您的数据。希望这有帮助。