选择最接近但不是更高的行

时间:2015-09-04 13:25:19

标签: sql-server-2012

我有三个表,我试图从dbo.VacationRateTable中选择VacationPctg以匹配dbo.TimeData中的LabourType和EmployeeID

dbo.TimeData
EmployeeID  LabourType  WorkDate    TimeSpent
451         Handling    2015-08-01  2.5
499         Supervisor  2015-08-01  1.9
505         Clerical    2015-08-01  6.2

dbo.EmployeeTable
EmployeeID  HireDate
451         2005-01-01
499         2001-01-01
505         2015-01-01

dbo.VacationRateTable
RateID  LabourType  DaysSinceHired  VacactionPctg
1       Handling         0               0.4
2       Handling      1825               0.6
3       Handling      4380               0.8
4       Clerical         0               0.4
5       Clerical      1825               0.6
6       Clerical      4380               0.8
7       Supervisor       0               0.4
8       Supervisor    1095               0.6
9       Supervisor    3650               0.8

这是我写的代码。但是,我似乎无法正确链接LabourType。似乎一旦DaySinceHired的数量超过3650,该声明就不会返回任何内容。

SELECT ET.EmployeeID
       ,ET.HireDate
       ,td.LabourType
       ,VRT.DaysSinceHired
       ,VRT.VacationPctg
       ,TD.WorkDate
       ,TD.TimeSpent
       ,-DATEDIFF(DAY,TD.WorkDate, ET.HireDate) as DaysWorked
FROM EmployeeTable   AS ET
LEFT join TimeData as TD
    on et.EmployeeID = TD.EmployeeID
    inner JOIN VacationRateTable AS VRT

    ON VRT.LabourType = TD.LabourType 
    and VRT.DaysSinceHired = 
    (SELECT MAX(DaysSinceHired)
    FROM VacationRateTable
    WHERE DaysSinceHired <= -DATEDIFF(DAY,TD.WorkDate, ET.HireDate))
    AND   TD.WorkDate > '2015-07-31' AND TD.WorkDate <'2015-09-01'

1 个答案:

答案 0 :(得分:0)

试试这个,我相信这就是你想要的。

SELECT ET.EmployeeID
       ,ET.HireDate
       ,td.LabourType
       ,VRT.DaysSinceHired
       ,VRT.VacactionPctg
       ,TD.WorkDate
       ,TD.TimeSpent
       ,DATEDIFF(DAY, ET.HireDate, TD.WorkDate) as DaysWorked
FROM EmployeeTable AS ET
LEFT JOIN TimeData AS TD 
    ON et.EmployeeID = TD.EmployeeID
JOIN VacationRateTable AS VRT 
    ON VRT.LabourType = TD.LabourType 
   AND VRT.DaysSinceHired = (
      SELECT MAX(DaysSinceHired)
      FROM VacationRateTable
      WHERE DaysSinceHired between 0 and DATEDIFF(DAY,ET.HireDate, TD.WorkDate)
        AND LabourType = TD.LabourType
      GROUP BY LabourType
   )
WHERE TD.WorkDate > '2015-07-31' AND TD.WorkDate <'2015-09-01';

使用您的样本数据,结果就是:

EmployeeID  HireDate    LabourType  DaysSinceHired  VacactionPctg   WorkDate    TimeSpent   DaysWorked
505         2015-01-01  Clerical    0               0.40            2015-08-01  6.20        212
451         2005-01-01  Handling    1825            0.60            2015-08-01  2.50        3864
499         2001-01-01  Supervisor  3650            0.80            2015-08-01  1.90        5325