2012-09-10 3 views
0

J'ai besoin d'obtenir empolyees info de employees table, et leurs salaires totaux de deux tables différentes.SQL joint pour obtenir des salaires totaux mensuels de trois tables

Le SQL est à peu près comme ça, mais je ne sais pas vraiment comment utiliser pour faire des jointures:

  • 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

Je ne suis pas sûr comment les joindre ensemble correctement. Je ne veux pas voir les employés qui n'ont pas travaillé pour le mois, mais seulement ceux qui l'ont fait. J'utilise mysql et mettra les données dans un tableau avec php

Si quelqu'un pouvait me dire comment faire la partie "CE MOIS" qui serait cool aussi. Juste être paresseux sur cette partie, mais figuré pendant que j'étais ici ...

Merci pour l'aide!

+0

Pourriez-vous nous donner la structure de la base de données des 3 tables et des données "exemple" pour chacune? – Tschallacka

+0

employés id-int, first_name-varchar, last_name-varchar; taxed_work id-int, id_employé-int, date-date, heures-flottant (8.2), pay-float (8,2); nontaxed_work identique à tax_work –

+0

Les tables de travail économisent les heures et paient pour chaque employé qui travaille un jour donné pour lequel il travaille. –

Répondre

2

Vous pouvez utiliser les sous-requêtes corrélées:

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

J'ai essayé cela avant et à travers une erreur, mais je vais voir si c'était une faute de frappe. Merci! –

+0

Il me dit que j'ai une erreur de syntaxe près de "from taxed_work tw où ..." –

0

Vous pouvez calculer les totaux à l'intérieur de la sous-requête.

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

Cela répéterait chaque ligne dans nontaxed_work pour chaque ligne dans taxed_work. Cela se traduit par un double comptage et des résultats beaucoup trop importants – Andomar

+0

@Andomar vous avez raison. beaucoup mieux si cela peut être fait à l'intérieur de la sous-requête. –

0

Essayez cette requête.

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) 

S'il vous plaît remplacer les champs t.this_date et n.this_date avec des noms réelles sur le terrain que je ne suis pas au courant de la structure de la table exacte. Remplacez également la valeur "this_month" selon vos besoins.

+0

Cela répéterait chaque ligne dans nontaxed_work pour chaque ligne dans taxed_work. Cela entraîne un double comptage et des résultats beaucoup trop importants. – Andomar

Questions connexes