2015-09-04 51 views
2

我有三个表,我试图从dbo.VacationRateTable挑VacationPctg到LabourType和雇员匹配dbo.TimeData选择行与最接近的,但不高于数量

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' 

回答

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 
+1

非常感谢JPW。这很好 –