我有三个表,我试图从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'
答案 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