2012-02-18 72 views
0

我的数据库中有三个表。SQL Server查询中类似员工的时间总和

第一个表是Employee

enter image description here

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

三表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为0:41:53的workingtime和EID 200的0:0:39。

请指教。

(注:最终输出应该在这个例子中数据三行,因为我需要显示时间和超时最终表中的字段呢!)

+3

请使用明确连接,而不是“表,表中”语法。 – pilcrow 2012-02-18 17:29:47

+0

Hi @Nida Sulheri我正面临同样的问题。你能否给我提供表格结构,或者你使用相同的,我需要在我的项目中实现相同的逻辑。 Regards – 2013-12-16 06:48:09

+1

@ A.Goutam表格结构在我上面的帖子中提到...请参阅表格截图。 – Azeem 2013-12-19 13:17:32

回答

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

此查询有效,但仅显示两行。你可以请阅读我刚刚添加的帖子中的NOTE! – Azeem 2012-02-18 18:25:38

+0

@NidaSulheri更新回答问题。 – 2012-02-18 18:55:16

+0

感谢您的回复。 SQL Server在提供的查询中的某些点显示错误。请从这里下载数据库,看看你能做些什么来修复它... http://www.mediafire.com/?ia0ljcvg99200vp – Azeem 2012-02-18 22:03:57

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

嗨,HoursConsumed有时间在几秒钟内。你可以请粘贴完整的查询,因为我不明白你的意思是什么 - “原始查询,但修改为不转换字符串”...谢谢 – Azeem 2012-02-18 17:46:11

+0

请参阅我刚刚添加的帖子中的注意! – Azeem 2012-02-18 18:30:30