2013-07-10 17 views
0

我有两个表。他们目前在Access 2010中,但最终会迁移到Microsoft SQL 2010 DBMS。一个叫做EmployeeWages,另一个叫TimeClock。 EmployeeWages包含员工ID,工资和生效日期。 TimeClock表具有员工ID,与员工相关的工资以及工资有效的日期。匹配一个表的条目与另一个表中的两个日期之间的数据点

我需要做的是匹配雇员工作的正确工资。目前该表具有TimeIn和TimeOut字段。为了简单起见,在这个问题中,我已经计算了工作时间,但是如果我可以在一个查询中获得所有内容,那将非常棒。

EmployeeWage 
---------------------------------------------------------------------- 
| EmployeeID | RecordNum | EffectiveDate | WorkType | Wage | 
-+------------+-+-----------+-+---------------+-+----------+-+------+- 
| 6240  |  1  |  1/18/13  | Line | 6 | 
---------------------------------------------------------------------- 
| 6240  |  2  |  4/1/13  | Bench | 7 | 
---------------------------------------------------------------------- 
| 6240  |  3  |  6/1/13  | Min  | 7.35 | 
---------------------------------------------------------------------- 
| 6240  |  4  |  6/23/13  | Bench | 5 | 
---------------------------------------------------------------------- 
| 6240  |  5  |  6/24/13  | Bench | 6.25 | 
---------------------------------------------------------------------- 
| 6240  |  5  |  6/25/13  | Bench | 7.25 | 
---------------------------------------------------------------------- 

然后

TimeClock 
-------------------------------------------------- 
| EmployeeID | WorkType | Work Date| Hours | 
-+------------+-+----------+-+---------+-+------+- 
| 6240  | Line | 6/22/13 | 5 | 
-------------------------------------------------- 
| 6240  | Bench | 6/22/13 | 7 | 
-------------------------------------------------- 
| 6240  | Bench | 6/23/13 | 5 | 
-------------------------------------------------- 
| 6240  | Bench | 6/24/13 | 6.25 | 
-------------------------------------------------- 
| 6240  | Min  | 6/24/13 | 2 | 
-------------------------------------------------- 

产生的匹配表应该像...

TimeClock 
----------------------------------------------------------- 
| EmployeeID | WorkType | Work Date| Hours | Wage | 
-+------------+-+----------+-+---------+-+------+-+------+- 
| 6240  | Line | 6/22/13 | 5 | 6 | 
----------------------------------------------------------- 
| 6240  | Bench | 6/22/13 | 6.25 | 7 | 
----------------------------------------------------------- 
| 6240  | Bench | 6/23/13 | 6 | 5 | 
----------------------------------------------------------- 
| 6240  | Bench | 6/24/13 | 5.5 | 6.25 | 
----------------------------------------------------------- 
| 6240  | Min  | 6/24/13 | 2 | 7.35 | 
----------------------------------------------------------- 

任何帮助,使他们那里我将不胜感激!

+0

你需要在加入一个额外条件,否则会产生(部分)Carthesian产品。 – wildplasser

回答

0
SELECT T.EmployeeID, T.WorkType, T.[Work Date], T.Hours, 
(SELECT Max(E.EffectiveDate) 
FROM EmployeeWage E 
WHERE T.EmployeeID = E.EmployeeID 
AND T.WorkType = E.WorkType 
AND E.EffectiveDate <= T.[Work Date]) AS ActiveDate, 
E.Wage as Wage 
FROM TimeClock T, EmployeeWage EW 
WHERE T.EmployeeID = EW.EmployeeID 
AND TW.WorkType = EW.WorkType 
AND E.EffectiveDate = ActiveDate 

请注意,我没有MS-Access,也没有尝试过。如果有帮助或错误,请告诉我。

0

我不知道一个完美的方式与一个单一的查询,让您的结果,但是这会给你的基本信息,你需要:

SELECT TimeClock.EmployeeID, TimeClock.WorkType, TimeClock.WorkDate, EmployeeWage.EffectiveDate, TimeClock.Hours, EmployeeWage.Wage 
    FROM EmployeeWage INNER JOIN TimeClock 
    ON EmployeeWage.EmployeeID = TimeClock.EmployeeID 
    AND TimeClock.WorkType = EmployeeWage.WorkType 
    WHERE TimeClock.WorkDate >= EmployeeWage.EffectiveDate; 
+0

@shahkalpesh我不断收到E.Wage,TW.WorkType,E.EctivectiveDate,ActiveDate的“输入参数值”提示。我将E.Wage改为EW.Wage,TW.WorkType改为T.WorkType,E.EffectiveDate改为EW.EffectiveDate。现在我所得到的是ActiveDate的提示... –

+0

是的,对不起,我在测试之前提出了自己的代码,并在测试之后进行了编辑。请尝试新的代码,看看是否适合你。请注意,_WorkDate_可能在您的数据库中不同。 – Sabe

相关问题