员工总计工资单小时数

时间:2012-07-10 17:27:56

标签: sql ms-access

好的,我们有一个Access数据库,我们每天为每位员工记录后期制作,非制作和其他时间。员工可能有几天的时间在项目之间分配。

对于工资核算输入目的,我们设计了一个总计工作小时数的报告,并计算常规时间和加班时间。我遇到的问题是,如果工作日在两个项目之间分配,那么它会错误地计算该日期的小时数。

例如,7月10日,该员工共工作了11个小时。在这些时间内,有{5}花费在WA302上,有6花在HU047上。当我为工资核算小时生成报告时,它会单独给出两个金额的总计,这意味着加班时间将无法正确计算。

如何根据每天工作日期得出总时数?

这是SQL语句:

SELECT
    EmployeeLookUptbl.EmployeeDriver,
    EquipmentTimesheettbl.Employee,
    EquipmentTimesheettbl.Date,
    EquipmentTimesheettbl.ProductionHours,
    EquipmentTimesheettbl.NonProductionHours,
    EquipmentTimesheettbl.RepairHours,
    EquipmentTimesheettbl.[Stat Holiday],
    EquipmentTimesheettbl.TravelTime,
    EquipmentTimesheettbl.TruckWash,
    EquipmentTimesheettbl.FirstAid,
    EquipmentTimesheettbl.DesignatedDriver,
    EquipmentTimesheettbl.LOA,
    EquipmentTimesheettbl.[Vehicle Allownance],
    EquipmentTimesheettbl.DaysWorked,
    [ProductionHours]+[NonProductionHours]+[RepairHours] AS TotalHours,
    IIf([TotalHours]>8,8,[TotalHours]) AS RegularHours,
    IIf([totalhours]<8,0,[totalhours]-8) AS Overtime,
    EquipmentTimesheettbl.RPP,
    EmployeeLookUptbl.FirstName,
    EquipmentTimesheettbl.Phase
FROM
    EquipmentTimesheettbl
    LEFT JOIN EmployeeLookUptbl
    ON EquipmentTimesheettbl.Employee = EmployeeLookUptbl.ReportName
WHERE
    (((EquipmentTimesheettbl.Date)
    Between [Enter Start Date] And [Enter End Date]))
ORDER BY EquipmentTimesheettbl.Date;

3 个答案:

答案 0 :(得分:1)

小时应该是作业的属性,所以你可以像这样访问它:

Total.hours = Job.hours + Job2.hours;

转换为

Total.hours = WA302.hours + HU047.hours;

转换为

Total.hours = 6+5;

希望这有助于您的思考过程,但除非您向我们展示您目前的工作方式(SQL,Java等),否则我们无法帮助您进行其他思考过程。

编辑:来自SQL,

sum(hours)

每个工作都应该是自己的一行。

答案 1 :(得分:1)

您需要使用SUM()来提供一个小时的总计。此外,简化查询 - 删除您不需要的所有字段。

从这开始:

SELECT Equip.Employee,
    Sum([ProductionHours]) AS TotalProductionHours, 
    Sum([NonProductionHours]) AS TotalNonProductionHours, 
    Sum([RepairHours]) AS TotalRepairHours, 
FROM EquipmentTimesheettbl As Equip
    LEFT JOIN EmployeeLookUptbl As Employee 
    ON Equip.Employee = Employee.ReportName
WHERE
    (((Equip.Date)
    Between [Enter Start Date] And [Enter End Date]))
ORDER BY Equip.Date;

然后将其用作新查询的基础。如果他们提供的信息仅用于报告,您可以将上面的内容更加稀疏 - 保存您的JOINS以供日后使用。

无论您在哪里看到单独的行而不是总计,都要删除强制突破的字段或插入GROUP BY子句。 'Date'是属于WHERE子句但不属于'SELECT'子句的字段的一个很好的例子。

这是tutorial可能会有所帮助。另外,Access Help应该为您解答这个问题(虽然我刚才没有找到关于这个主题的内容)。

此外,非常重要您没有将表字段命名为“Date”,因为这是一个Access保留关键字!

答案 2 :(得分:0)

听起来您按日期和项目进行分组,而不仅仅是日期。在不知道Access数据库的架构或您尝试使用的查询的情况下,无法确切知道。

根据您的问题的声音,您需要一份报告,该报告将按日期和员工为您提供小计。

我知道这不是你问题的答案,但是有很多工具可以跟踪员工的工作并做薪资。除非你有非常具体的需求,否则我建议使用像Quickbooks这样的东西,而不是在Access中构建一些东西。查看http://quickbooksonline.intuit.com/time-tracking-software。注意我甚至不使用它们,或者为它们工作,但它几乎绝对值得每月40美元收取所有功能。