【发布时间】:2014-01-04 20:34:52
【问题描述】:
我想计算每周超过 40 小时的工作时间。
table = shift_log_data
database = shift_logs
Field Type Null Key Default Extra
id int(100) NO PRI NULL auto_increment
admin_hrs decimal(20,2) NO 0.00
shop_hrs decimal(20,2) NO 0.00
fab_hrs decimal(20,2) NO 0.00
paint_hrs decimal(20,2) NO 0.00
vacation_hrs decimal(50,2) NO 0.00
control_hrs decimal(20,2) NO 0.00
test_hrs decimal(20,2) NO 0.00
engine_hrs decimal(20,2) NO 0.00
hydraulic_hrs decimal(20,2) NO 0.00
699_paint varchar(100) NO 0.00
699_shop varchar(100) NO 0.00
maint_hrs varchar(100) NO 0.00
date date NO NULL
name varchar(50) NO NULL
job varchar(50) NO NULL
需要使用日期字段每周总计从 admin_hrs 到 maint_hrs 列。
如果每周工作时间超过 40 小时,请创建一个名为 overtime 的别名,以显示其余时间超过 40 小时。
我试过了。
SELECT SUM(overtime)
FROM
(
SELECT name,
IF(SUM(test_hrs+fab_hrs+control_hrs+shop_hrs+paint_hrs+engine_hrs+hydraulic_hrs)>40,
SUM(test_hrs+fab_hrs+control_hrs+shop_hrs+paint_hrs+engine_hrs+hydraulic_hrs))-40,
0) AS overtime
FROM shift_log_data
GROUP BY name
) TOTAL_OVERTIME
【问题讨论】:
-
"...
admin_hrs到maint_hrs..." --maint_hrs是varchar,而不是数字。699_paint和699_shop也是如此。这没有意义。 -
您的解决方案的实际问题是什么?有语法错误吗?计算结果有误吗?
-
对表格设计的一些批评 -
name不是一个人的唯一标识符,您需要某种唯一的人 id fk 到person表格。出于大致相似的原因,您可能还想要一个job表。该表可能应该被规范化,因此有一个hours_worked字段(或者可能是minutes_worked,因为一个小时不会完全分成以 10 为基数的分数),并带有一个hour_type字段。为什么将假期小时计入总数?这听起来可以利用。或者,有一张带有打卡/下班时间(和类型)的表。它是 MySQL 还是 SQL Server? -
计算结果不正确。不是每周分组,也不是每周计算加班时间。
标签: mysql sql sql-server select if-statement