2013-12-17 106 views
2

我想計算每週工作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小時,請製作一個名爲「超時」的別名,表示剩下的小時數大於四十。

我試過了。

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 
+0

_ 「...''通過maint_hrs' admin_hrs' ......」 _ - 'maint_hrs'是'varchar',不是一個數字。 「699_paint」和「699_shop」也是如此。這根本不符合邏輯。 –

+0

解決方案的實際問題是什麼?有語法錯誤嗎?計算結果是否錯誤? –

+1

對桌子設計的一些批評 - 「名字」不是一個人的唯一標識符,你需要某種獨特的人身份證fk到「人」桌。你可能也需要一份「工作表」,原因大致相同。這個表格應該是標準化的,所以有一個'hours_worked'字段(或者'minutes_worked',因爲一個小時不會乾淨地劃分爲10個基數部分),並且有一個'hour_type'字段。爲什麼**假期**小時計入總數?這聽起來是可利用的。另外,有一個表有一個clockin/out時間(和類型)。這是什麼,MySQL或SQL Server? –

回答

0

試試這個:

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