2012-09-10 65 views
0

我需要從employees table獲得empolyees信息,以及來自兩個不同表格的總工資。SQL加入以從三個表中獲取月總計工資

的SQL大約是這樣的,但我真的不知道如何使用連接來做到這一點:

  • CONCAT(first_name, ' ', last_name) from employees as e
  • Sum(hours*pay) where date is "THIS MONTH" and employee_id = e.id from taxed_work
  • Sum(hours*pay) where date is "THIS MONTH" and employee_id = e.id from nontaxed_work

我不是確定如何正確地將它們連接在一起。我不想看到任何一個月沒有完成任何工作的員工,只有那些有工作的員工。我正在使用mysql,並將數據放在一個表格中。如果有人能告訴我怎麼做「THIS MONTH」部分,那也會很酷。只是懶惰的那部分,但想到當我在這裏...

感謝您的幫助!

+0

你能否給我們3個表的數據庫結構和每個「示例」數據? – Tschallacka

+0

員工id-int,first_name-varchar,last_name-varchar; (8.2),支付浮動(8,2);支付浮動(8,2); nontaxed_work與tax_work相同 –

+0

工作表保存每個員工在工作的任何特定日期工作的小時數和工資。 –

回答

2

你可以使用相關子查詢:

select concat(first_name, ' ', last_name) 
,  (
     select sum(hours*pay) 
     from taxed_work tw 
     where tw.employee_id = e.id 
       and year(tw.date) = year(now()) 
       and month(tw.date) = month(now()) 
     ) 
,  (
     select sum(hours*pay) 
     from nontaxed_work ntw 
     where ntw.employee_id = e.id 
       and year(ntw.date) = year(now()) 
       and month(ntw.date) = month(now()) 
     ) 
from employees e 
+0

我之前曾嘗試過這個錯誤,但是我會看看它是否是錯字。謝謝! –

+0

這是告訴我,我附近有一個語法錯誤「from taxed_work tw where ...」 –

0

可以計算內部子查詢的總數。

SELECT a.id , 
     CONCAT(first_name, ' ', last_name) FullName, 
     b.totalTax, 
     c.totalNonTax, 
FROM employees a 
     LEFT JOIN 
     (
      SELECT employee_id, Sum(hours*pay) totalTax 
      FROM taxed_work 
      WHERE DATE_FORMAT(`date`,'%c') = DATE_FORMAT(GETDATE(),'%c') 
      GROUP BY employee_id 
     ) b ON b.employee_id = a.id 
     LEFT JOIN 
     (
      SELECT employee_id, Sum(hours*pay) totalTax 
      FROM nontaxed_work 
      WHERE DATE_FORMAT(`date`,'%c') = DATE_FORMAT(GETDATE(),'%c') 
      GROUP BY employee_id 
     ) c ON c.employee_id = a.id 
+0

這將重複taxed_work中每行的nontaxed_work中的每一行。這導致重複計數和太大的結果 – Andomar

+0

@Andomar你是正確的。如果可以在子查詢中完成的話會好得多。 –

0

試試這個查詢。

select 
    CONCAT(first_name, ' ', last_name) as employee_name, 
    sum(case when t.this_date = 'this_month' then t.hours*t.pay else 0 end), 
    sum(case when n.this_date = 'this_month' then t.hours*t.pay else 0 end) 
from employees e 
    left join taxed_work t on e.id = t.employee_id 
    left join nontaxed_work n on e.id = n.employee_id 
group by (first_name, ' ', last_name) 

請更換t.this_date和n.this_date領域與實際字段名,因爲我不知道確切的表結構。此外,根據需要替換「this_month」值。

+0

這將重複taxed_work中每行的nontaxed_work中的每一行。這會導致重複計算並導致太大的結果。 – Andomar