Несколько случаев с другой таблицей - PullRequest
2 голосов
/ 31 октября 2019

У меня есть такой запрос:

select U.Name,U.Adluserid as 'Empid', 
       min(case when IOType=0 then Edatetime end) as 'IN',
       max(case when IOType=1 then Edatetime end) as 'out'
       from Mx_ACSEventTrn
inner join Mx_UserMst U on Mx_ACSEventTrn.UsrRefcode=U.UserID
left join Tbl_Zeo_Empstatus E on  Mx_ACSEventTrn.UsrRefcode=E.Emp_Id
where cast(Edatetime as date) between '2019-10-30' and '2019-10-30' 
group by U.Name,U.Adluserid

output

 Name            Empid     IN                          OUT                status           
JAS             505  2019-10-30 08:06:37.000    2019-10-30 14:13:29.000   Present
SAAJ            516  2019-10-30 08:05:11.000    2019-10-30 14:17:58.000   Absent
ram             516  2019-10-30 08:20:11.000    2019-10-30 14:17:58.000   Late

У меня есть другая таблица, подобная этой: Tbl_Zeo_Empstatus

Emp_Id  Status
123      2
504      2
505      3
  • Я хочу показать столбец состояния в зависимости от этого условия. Если время IN не равно нулю, проверьте время более 8.15. Если оно больше 8.15, тогда покажите позднее другое мудрое шоу, присутствующее.

  • ЕСЛИ во времени ноль, тогда проверьте статус сотрудника из этой таблицы "Tbl_Zeo_Empstatus", если статус 2, то покажите«Отсутствует», если статус 3, тогда покажите «Отпуск» вот так.

Как мне этого добиться?

Ответы [ 2 ]

1 голос
/ 31 октября 2019

Вам необходим дополнительный уровень запроса (дополнительный выбор), чтобы иметь возможность работать с 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
0 голосов
/ 31 октября 2019

старайтесь избегать внутреннего выбора, как это

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
    into #tmp 
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

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 
#tmp t
left join Tbl_Zeo_Empstatus e on t.UserID = e.Emp_Id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...