2015-12-21 2 views
1

У меня есть простая таблица, в которой записываются люди, синхронизирующие и синхронизирующие так.Группа по набору значений (Check-in or Check-out)

Id  | EmployeeNumber | InOutId | InOutDateTime 
----------------------------------------------------- 
1  | 505   | IN  | 2015-03-24 08:32:42:000 
1  | 506   | IN  | 2015-03-24 08:35:47:000 
1  | 507   | IN  | 2015-03-24 08:46:12:000 
1  | 505   | OUT  | 2015-03-24 16:59:00:000 
1  | 506   | OUT  | 2015-03-24 17:05:00:000 

Я хочу показать общее количество людей в настоящее время IN и тех, кто в настоящее время находится. Другими словами: - Total IN означает те, у которых нет соответствующего OUT для данного дня. - Total OUT означает те, у которых есть IN и OUT для данного дня.

Итак, основываясь на моем столе выше, я хочу, чтобы получить следующие результаты:

TotalCurrentlyIn  | TotalCurrentlyOut 
----------------------------------------- 
1     | 2 

Это то, что я до сих пор:

DECLARE @d date; 
set @d = cast('2015-03-24 15:02:42.000' as date) 

select EmployeeNumber, InOutId, InOutDateTime from MyAttendance 
where 
    InOutDateTime >= DATEADD(day, DATEDIFF(day, 0, @d), 0) 
    and InOutDateTime < DATEADD(day, DATEDIFF(day, 0, @d) +1, 0) 
order by 
    EmployeeNumber, InOutId 

Мне нужно, чтобы иметь возможность подвести и группа - любые идеи?

+1

Тег dbms used. (Не похоже на ANSI SQL ...) – jarlh

ответ

0

CheckIn = 1 и CheckOut = 2, поэтому вам нужно проверить последнюю запись всех видов использования.

Select EmployeeId, ActionType, Max(ActionDateTime) From AttendanceLog Where ActionDateTime >= DATEADD(day, DATEDIFF(day, 0, @d), 0) and ActionDateTime < DATEADD(day, DATEDIFF(day, 0, @d) +1, 0) Group by EmployeeId, ActionType Order by EmployeeId,ActionType

0

Если я правильно понял вопрос. Вы должны знать, сколько человек находится в офисе прямо сейчас:

первый запрос возвращает максимальную дату для любого сотрудника, чем присоединиться к нему с ActionType

select 
EmployeeId , max(ActionDateTime) as MaxActionDateTime into #temptable 
from table 
group by EmployeeId 


select count (EmployeeId), ActionType 
from table inner join #temptable 
on table.EmployerId == #temptable.EmployerId 
    and table.ActionDateTime == #temptable.MaxActionDateTime 
group by ActionType 
+0

Лучше избегать использования временных таблиц по соображениям производительности - можете ли вы предоставить альтернативу без использования временных таблиц? – AshesToAshes

+1

вы можете использовать select в select, поместить первый запрос в (select ...) как tbl и thanjoin и выбрать из всех таблиц – Racheli

+0

Это сработало, спасибо, я хотел отфильтровать его в соответствии с датой. – Faizan

1

попробовать,

DECLARE @d date; 
    set @d = cast('2015-03-24 15:02:42.000' as date) 

    ;with cte as(
    select t.EmployeeNumber,t.InOutId as in1, 
    t1.InOutId out1,t.InOutDateTime from @t t 
    left join (select EmployeeNumber,InOutId,InOutDateTime from @t 
    where InOutId='OUT' and cast(InOutDateTime as date)=cast(@d as date)) t1 
     on t.EmployeeNumber=t1.EmployeeNumber and 
     cast(t.InOutDateTime as date)=cast(t1.InOutDateTime as date) 
      where t.InOutId='IN' and cast(t.InOutDateTime as date)=cast(@d as date)) 
    select count(in1) Totalin,count(out1) Totalout, sum(case when out1 is null then 1 else 0 end) TotalCurrentlyIn 
    ,count(out1) TotalCurrentlyOut from cte 

данные

declare @t table (Id int,EmployeeNumber int, InOutId varchar(3), InOutDateTime datetime) 
insert into @t(Id, EmployeeNumber,InOutId, InOutDateTime) values 
(1  , 505   , 'IN'  , '2015-03-24 08:32:42:000'), 
(1  , 506   , 'IN'  , '2015-03-24 08:35:47:000'), 
(1  , 507   , 'IN'  , '2015-03-24 08:46:12:000'), 
(1  , 505   , 'OUT'  , '2015-03-24 16:59:00:000'), 
(1  , 506   , 'OUT'  , '2015-03-24 17:05:00:000') 
+0

его не указывая количество сотрудников, которые находятся либо в или в эту конкретную дату , его отображение для конкретного сотрудника – Faizan

+0

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

+0

«всего в» и «всего», был добавлен в решение, спасибо – nazark

0

Использование функции кадрирования вы можете получить последнее действие для каждого emplo лет и считайте их

With data As (
    Select id, EmployeeNumber, InOutId 
     , lastAction = ROW_NUMBER() OVER (PARTITION BY EmployeeNumber 
             ORDER BY InOutDateTime DESC) 
    From table1 
) 
Select Count(CASE InOutId WHEN 'IN' THEN 1 END) TotalCurrentlyIn 
    , Count(CASE InOutId WHEN 'OUT' THEN 1 END) TotalCurrentlyOut 
From data 
Where lastAction = 1 
Смежные вопросы