我的数据库中有三个表。
第一个表格是Employee
:
第二个表是EmployeeTimeIn
:( HoursConsumed有几秒钟的时间!)
第三个表格是EmployeeTimeOut
:
我编写了以下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;
它产生以下输出:
我需要修改此查询,以便为每位员工显示workingtime
列中的总工作时间。在这种情况下,对于EID 4,它将显示workingtime
0:41:53,对于EID 200,它将显示0:0:39。
请告知。
(注意:此示例数据的最终输出应该有三行,因为我还需要在最终表中显示Time In和Time Out字段!)
答案 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
您还可以将时间计算拉出到一个函数中,以便按员工和日期计算小时数,但不确定您的数据。希望这有帮助。