【问题标题】:Matching One Table's Entry With a Data Point Between Two Dates in Another Table将一个表的条目与另一个表中两个日期之间的数据点匹配
【发布时间】:2013-07-11 05:30:42
【问题描述】:

我有两张桌子。它们目前在 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 |
-----------------------------------------------------------

如果能帮我到那里,我们将不胜感激!

【问题讨论】:

  • 您需要在连接中添加额外条件,否则会产生(部分)Carthesian 产品。

标签: sql ms-access


【解决方案1】:
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,也没有尝试过。如果有帮助或错误,请告诉我。

【讨论】:

    【解决方案2】:

    我不知道通过单个查询获取结果的完美方法,但这将为您提供所需的基本信息:

    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;
    

    【讨论】:

    • @shahkalpesh 我不断收到提示为 E.Wage、TW.WorkType、E.EffectiveDate、ActiveDate 输入参数值。我将 E.Wage 更改为 EW.Wage,将 TW.WorkType 更改为 T.WorkType,将 E.EffectiveDate 更改为 EW.EffectiveDate。现在我得到的只是 ActiveDate 的提示...
    • 是的,很抱歉,我在测试之前提交了我的代码,并且在测试后进行了编辑。请尝试新代码,看看是否适合您。请注意,您的数据库中的 WorkDate 可能不同。
    猜你喜欢
    • 1970-01-01
    • 2022-06-10
    • 2015-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多