Вам необходим дополнительный уровень запроса (дополнительный выбор), чтобы иметь возможность работать с in
и out
временем, которые являются агрегатами (мин. И макс.). Чтобы иметь возможность объединить ваши данные с Tbl_Zeo_Empstatus
, нам нужно предоставить внешний запрос с u.UserID
, а затем выполнить левое соединение на основе этого столбца.
Для окончательного запроса просто необходимо выражение CASE
, чтобы оценить ваши условия и установить ожидаемый статус на основе столбца времени in
.
select
t.Name,
t.Empid,
t.t_in,
t.t_out,
case
when t.t_in is null and E.status = 2 then 'Absent'
when t.t_in is null and E.status = 3 then 'Vacation'
when cast(t.t_in as time) > '08:15' then 'Late' else 'Present'
end as status
from (
select
u.UserID,
u.Name,
u.Adluserid as empid,
min(case when IOType=0 then Edatetime end) as t_in,
max(case when IOType=1 then Edatetime end) as t_out,
from
Mx_ACSEventTrn t
inner join Mx_UserMst u on t.UsrRefcode = u.UserID
where
cast(Edatetime as date) between '2019-10-30' and '2019-10-30'
group by
u.UserId, u.Name, u.Adluserid
) t
left join Tbl_Zeo_Empstatus e on t.UserID = e.Emp_Id