2010-03-09 96 views
3

我有一个工资表数据的SQL表,它具有工资率和与这些工资率相关的生效日期,以及在各种日期上工作的小时数。它看起来有点像这样:查找sql​​查询以获取每个分组的最新关联日期

EMPID DateWorked Hours WageRate EffectiveDate 

1  1/1/2010  10  7.00  6/1/2009 
1  1/1/2010  10  7.25  6/10/2009 
1  1/1/2010  10  8.00  2/1/2010 
1  1/10/2010 ... 
2  1/1/2010 ... 

...

等。基本上,数据合并的方式是,每天工作时,员工的所有工资历史都汇总在一起,我想获得与最迟生效日期相关的工资率,这个日期不迟于工作日期。所以在上面的例子中,2009年10月6日生效的7.25是我想要的。

什么样的查询可以放在一起呢?我可以使用MAX(EffectiveDate)以及基于在工作日期之前的标准,但只能给我最新的日期本身,我想要相关的工资。我为此使用Sql Server。

或者,我有用于创建此数据的原始表。其中一个包含工作日期,时间以及EMPID,另一个包含工资率和生效日期列表。有没有加入这些方法的方法,可以在每个工作日正确应用正确的工资率?

我在想,我想通过EMPID然后DateWorked分组,然后从那里做点什么。我希望得到一个结果给我的工资率,实际上是最新的效率对于每一日期,工作

回答

3
select p.* 
from (
    select EMPID, DateWorked, Max(EffectiveDate) as MaxEffectiveDate 
    from Payroll 
    where EffectiveDate <= DateWorked 
    group by EMPID, DateWorked 
) pm 
inner join Payroll p on pm.EMPID = p.EMPID and pm.DateWorked = p.DateWorked and pm.MaxEffectiveDate = p.EffectiveDate 

输出:

EMPID  DateWorked    Hours  WageRate        EffectiveDate 
----------- ----------------------- ----------- --------------------------------------- ----------------------- 
1   2010-01-01 00:00:00.000 10   7.25         2009-06-10 00:00:00.000 
+0

这很好。谢谢! – 2010-03-10 13:34:16

0
SELECT TOP 1 EMPID, WageRate 
FROM wages 
WHERE ...... 
ORDER BY EffectiveDate DESC 
2

试试这个:

DECLARE @YourTable table (EMPID int, DateWorked datetime, Hours int 
         ,WageRate numeric(6,2), EffectiveDate datetime) 
INSERT INTO @YourTable VALUES (1,'1/1/2010' ,10,  7.00, '6/1/2009') 
INSERT INTO @YourTable VALUES (1,'1/1/2010' ,10,  7.25, '6/10/2009') 
INSERT INTO @YourTable VALUES (1,'1/1/2010' ,10,  8.00, '2/1/2010') 
INSERT INTO @YourTable VALUES (1,'1/10/2010',10,  20.00,'12/1/2010') 
INSERT INTO @YourTable VALUES (2,'1/1/2010' ,8 ,  12.00, '2/1/2009') 

SELECT 
    e.EMPID,e.WageRate,e.EffectiveDate 
    FROM @YourTable e 
     INNER JOIN (SELECT 
         EMPID,MAX(EffectiveDate) AS EffectiveDate 
         FROM @YourTable 
         WHERE EffectiveDate<GETDATE()+1 
         GROUP BY EMPID 
        ) dt ON e.EMPID=dt.EMPID AND e.EffectiveDate=dt.EffectiveDate 
    ORDER BY e.EMPID 

输出

EMPID  WageRate        EffectiveDate 
----------- --------------------------------------- ----------------------- 
1   8.00         2010-02-01 00:00:00.000 
2   12.00         2009-02-01 00:00:00.000 

(2 row(s) affected) 
+0

这是寻找在今天之前这是最新的生效日期,而不是WorkedDate之前的,但最新的,否则它看起来像一个不错的办法。 – 2010-03-10 11:53:45

2

喜欢的东西这应该工作:

SELECT T.* FROM T 
INNER JOIN (
    SELECT EMPID, MAX(EFFECTIVEDATE) EFFECTIVEDATE 
    FROM T 
    WHERE DATEWORKED <= EFFECTIVEDATE 
    GROUP BY EMPID) t2 
    ON T2.EMPID = T.EMPID 
    AND T2.EFFECTIVEDATE = T.EFFECTIVEDATE