Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 根据列的总和计算加班时间_Mysql_Sql_Sql Server_Select_If Statement - Fatal编程技术网

Mysql 根据列的总和计算加班时间

Mysql 根据列的总和计算加班时间,mysql,sql,sql-server,select,if-statement,Mysql,Sql,Sql Server,Select,If Statement,我想计算每周超过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

我想计算每周超过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\u hrs
maint\u hrs
total。
如果每周工作时间超过40小时,则制作一个名为“加班”的别名,显示剩余超过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
试试这个:

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);

“…
admin\u hrs
maint\u hrs
…”--
maint\u hrs
是一个
varchar
,而不是一个数字。
699_油漆
699_车间
也是如此。这没有道理。您的解决方案的实际问题是什么?有语法错误吗?计算结果是否有误?对表设计的一些批评-
name
不是一个人的唯一标识符,您需要在
person
表中使用某种唯一的person id fk。出于大致相似的原因,您可能还需要一个
作业
表。此表可能应该标准化,因此有一个
hours\u worked
字段(或者可能是
minutes\u worked
,因为小时不能完全划分为10个基本分数),带有
hour\u type
字段。为什么休假时间被计入总数?这听起来是可以利用的。或者,有一个带有时钟输入/输出时间(和类型)的表。是MySQL还是SQL Server?计算结果不正确。它不是每周分组或每周计算加班。