2015-11-17 4 views
0

Я пытаюсь рассчитать, сколько времени на отпуск будет у сотрудника, исходя из количества времени, в течение которого он работал.Присоединиться к максимальному значению, если условие присоединения не выполнено

employeeVacation -> идентификатор, yearsWorked, vacationHours

сотрудник -> EmpID, StartDate

я могу получить количество лет, работник работал с помощью этого

datepart(year, getdate()) - datepart(year,StartDate) as yearsWorked 

После работы для более того, 8 лет, время отпуска такое же. Вот мой праздничный стол.

id years vacationHours 
1 0 40 
2 1 40 
3 2 40 
4 3 80 
5 4 80 
6 5 80 
7 6 80 
8 7 120 

select e.empid, ev.vacationhours from employee e join employeevacation ev on 
ev.yearsWorked = datepart(year, getdate()) - datepart(year,e.StartDate) 

Так что скажите, что вы работаете в течение 30 лет. Я не могу присоединиться, чтобы получить количество часов отпуска. Должен ли я искать присоединение, или я должен просто сократить свои потери и вставить годы в таблицу отдыха до 100, так что я могу присоединиться и не беспокоиться об этом.

+0

Будьте осторожны здесь. Если у вас есть сотрудник, который стартовал в декабре, и вы запустили его в следующем январе (это может быть всего лишь пару дней), вы вернетесь 1 как количество лет работы, когда оно даже не было более месяца. –

ответ

1
SELECT e.empid, ISNULL(ev.vacationhour, 0) 
FROM employee e 
LEFT JOIN employeevacation ev ON ev.yearsWorked = (
    SELECT MAX(ev2.yearsWorked) 
    FROM employeevacation ev2 
    WHERE yearsWorked<=datepart(year, getdate()) - datepart(year,e.StartDate) 
) 

В принципе, вы запрашиваете высокий порог он имеет право.

Вы можете заменить 0 любым значением по умолчанию, которое может вам понадобиться. Хотя вы никогда не должны использовать значение по умолчанию, если у вас есть строка employeevacantion с 0 годами.

+0

Спасибо @Julien! Это сработало отлично! – Brandon

1

Вы можете сделать что-то вроде этого

select e.empid, coalesce(ev.vacationhours, evMax.vacationhours) 
from employee e 
    left join employeevacation ev on ev.yearsWorked = datepart(year, getdate()) - datepart(year,e.StartDate) 
    join employeevacation evMax on evMax.yearsWorked = 7 
Смежные вопросы