2010-03-09 45 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