【问题标题】:Calculate Overtime based on a sum of columns根据列的总和计算加班时间
【发布时间】: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_hrsmaint_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_hrsmaint_hrs..." -- maint_hrsvarchar,而不是数字。 699_paint699_shop 也是如此。这没有意义。
  • 您的解决方案的实际问题是什么?有语法错误吗?计算结果有误吗?
  • 对表格设计的一些批评 - name 不是一个人的唯一标识符,您需要某种唯一的人 id fk 到 person 表格。出于大致相似的原因,您可能还想要一个job 表。该表可能应该被规范化,因此有一个 hours_worked 字段(或者可能是 minutes_worked,因为一个小时不会完全分成以 10 为基数的分数),并带有一个 hour_type 字段。为什么将假期小时计入总数?这听起来可以利用。或者,有一张带有打卡/下班时间(和类型)的表。它是 MySQL 还是 SQL Server?
  • 计算结果不正确。不是每周分组,也不是每周计算加班时间。

标签: mysql sql sql-server select if-statement


【解决方案1】:

试试这个:

SELECT s.Name, YEAR(s.Date), WEEKOFYEAR(s.date),
      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 s
GROUP BY s.Name, YEAR(s.Date), WEEKOFYEAR(s.date);

【讨论】:

    猜你喜欢
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-24
    • 1970-01-01
    相关资源
    最近更新 更多