2012-08-30 141 views
1

我有一个员工表和一个leave_allocation表,它具有一对多的关系,每个员工在一段时间内都有许多假期分配。我想为每位员工获得最新的分配。SQL聚合组由

我试着查询,但日期和天值不关联到同一行

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 

我怎样才能得到每名雇员的最新配置?

回答

1

放置MAX()日在一个子查询:

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 

我也切换到使用ANSI联接语法,而不是表之间用逗号查询。

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 

如果可以有多个具有相同employee_number和日期的行,则需要求和。

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

注意,这会产生重复,如果员工ID和日期的组合不是leave_allocation独特。 –

+0

@ Eric Petroelje - 是的,但我的假设是他们,否则,拥有2行具有相同员工ID和日期的行会有什么意义?无论如何,我提出了一个替代方案,以防万一有多行,请参阅编辑答案。 – dcp

1

试试这个,

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