Sql server 按一组值分组(签入或签出)

Sql server 按一组值分组(签入或签出),sql-server,sql-server-2012,Sql Server,Sql Server 2012,我有一个简单的表,记录人们打卡和打卡,就像这样 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

我有一个简单的表,记录人们打卡和打卡,就像这样

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
我想显示目前入住和外出的总人数。换言之: -“总输入”指在给定日期内没有相应输出的输入。-Total 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和签出=2,因此您需要检查所有用途的最后一个条目

选择EmployeeId、ActionType、MaxActionDateTime 来自阿滕丹塞洛 哪里 ActionDateTime>=DATEADDday、DATEDIFFday、0、@d、0 和ActionDateTime如果我理解这个问题,请输入EmployeeId和ActionType。你需要知道现在办公室里有多少人:

第一个查询返回任何员工的最大日期,然后将其与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
试试看

资料


使用窗口功能,您可以获得每个员工的最后一个操作,并统计这些操作

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

使用标记dbms。看起来不像ANSI SQL…出于性能原因,最好避免使用临时表-您可以提供一个不使用临时表的替代方案吗?您可以在选择中使用select,将第一个查询放入select..作为tbl和thanjoin,并从所有表中进行选择。谢谢,我想根据日期对其进行筛选。将where添加到第一个查询中:where CONVERTdate,ActionDateTime==CONVERTdate,@D和actionDateTimeIt没有给出在该特定日期进入或离开的员工计数,它为某个特定的雇员显示雇员来了我想知道在某个特定日期上班或下班的雇员人数。。。比如12月21日,有多少员工外出和入职?解决方案中添加了“全入”和“全出”,谢谢
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')
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