2012-08-30 3 views
1

J'ai une table employee et une table leave_allocation qui a une relation un-à-plusieurs. Chaque salarié dispose d'un certain nombre d'allocations de congé sur une période donnée. Je voudrais obtenir l'allocation la plus récente pour chaque employé.Groupe d'agrégation SQL par

J'ai essayé la requête, mais la date et les valeurs de jours ne correspondent pas à la même rangée

select e.employee_number, e.nme, MAX(l.date), l.days 
from employee e, leave_allocation l 
where l.employee_id = e.employee_id 
group by e.employee_number, e.nme 

Comment puis-je obtenir la dernière allocation par employé?

Répondre

1

Placez la date MAX() dans une sous-requête:

SELECT e.employee_number, e.nme, l.leavedate, la.days 
FROM employee e 
INNER JOIN 
(
    SELECT Max(date) leavedate, employee_id 
    FROM leave_allocation 
    GROUP BY employee_id 
) l 
    ON e.employee_id = l.employee_id 
INNER JOIN leave_allocation la 
    ON l.employee_id = la.employee_id 
    AND l.leavedate = la.date 

Je mis également la requête d'utiliser la syntaxe ANSI joindre au lieu de virgules entre les tables.

2
SELECT e.employee_number 
     ,e.nme 
     ,l.days 
    FROM employee e 
     , leave_allocation l 
     ,(SELECT employee_id 
       ,MAX(DATE) date 
      FROM leave_allocation 
     GROUP BY employee_id) m 
WHERE l.employee_id = e.employee_id 
    AND l.employee_id = m.employee_id 
    AND l.date = m.date 

S'il peut y avoir plusieurs lignes avec le même numéro d'employé et la même date, vous devez additionner.

SELECT e.employee_number 
     ,e.nme 
     ,sum(l.days) 
    FROM employee e 
     , leave_allocation l 
     ,(SELECT employee_id 
       ,MAX(DATE) date 
      FROM leave_allocation 
     GROUP BY employee_id) m 
WHERE l.employee_id = e.employee_id 
    AND l.employee_id = m.employee_id 
    AND l.date = m.date 
GROUP BY e.employee_number 
     ,e.nme 
+0

Notez que cela produit des doublons si la combinaison d'identité des employés et la date ne sont pas uniques dans leave_allocation. –

+0

@ Eric Petroelje - Oui, mais mon hypothèse est qu'ils étaient, sinon, quel serait le point d'avoir 2 lignes avec le même id d'employé et la date? Quoi qu'il en soit, j'ai proposé une alternative juste au cas où il pourrait y avoir plusieurs lignes, voir la réponse éditée. – dcp

1

Essayez celui-ci,

SELECT e.employee_number, e.nme, c.maxDate, l.days 
FROM employee e 
      INNER JOIN leave_allocation l 
       ON l.employee_id = e.employee_id 
      INNER JOIN 
      (
       select employee_id, MAX(date) maxDate 
       from leave_allocation 
       group by employee_id 
      ) c ON c.employee_id = l.employee_ID AND 
        c.maxDate = l.date