2012-09-10 34 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