【问题标题】:Get All punch in and out for each employee?为每位员工获取所有信息?
【发布时间】:2018-01-11 11:20:21
【问题描述】:

预期输出:

SL#  Emp#   Employee Name       IN                     OUT         
1    106    George Jacob 24/Sep/2017 8:08:00AM 24/Sep/2017 12:53:00PM 04:45:00
                         24/Sep/2017 2:13:00PM 24/Sep/2017 5:58:00PM 03:45:00
                         25/Sep/2017 8:12:00AM 25/Sep/2017 6:02:00PM 09:50:00
                         26/Sep/2017 8:18:00AM 26/Sep/2017 2:15:00PM 05:57:00
                         26/Sep/2017 2:32:00PM 26/Sep/2017 6:00:00PM 03:28:00
                         27/Sep/2017 8:02:00AM 27/Sep/2017 5:57:00PM 09:55:00
                         28/Sep/2017 8:01:00AM 28/Sep/2017 6:01:00PM 10:00:00
                         01/Oct/2017 8:16:00AM 01/Oct/2017 5:56:00PM 09:40:00
                         02/Oct/2017 7:58:00AM 02/Oct/2017 5:56:00PM

我试过这个查询,但没有得到上面提到的准确输出:

SELECT Row_number()
     OVER (ORDER BY A.dt ASC)                        AS SNo,
     CONVERT(DATE, A.dt)
   --CONVERT(VARCHAR(26), A.DT, 103)  as DATEEVENT, 
                                                 b.emp_code,
   B.emp_name,
   F.event_entry_name,
   a.dt,
   Cast(LEFT(CONVERT(TIME, a.dt), 5) AS VARCHAR) AS 'time',
   Isnull(B.areaname, 'OAE6080036073000006')     AS areaname,
   C.dept_name,
   b.emp_reader_id,
   Isnull(c.dept_name, '')                       AS group_name,
   CONVERT(CHAR(11), '2017/12/30', 103)          AS StartDate,
   CONVERT(CHAR(11), '2018/01/11', 103)          AS ToDate,
   0                                             AS emp_card_no
FROM   dbo.trnevents AS A
   LEFT OUTER JOIN dbo.employee AS B
                ON A.emp_reader_id = B.emp_reader_id
   LEFT OUTER JOIN dbo.departments AS C
                ON B.dept_id = C.dept_id
   LEFT OUTER JOIN dbo.devicepersonnelarea AS E
                ON A.pointid = E.areaid
   LEFT OUTER JOIN dbo.event_entry AS F
                ON A.eventid = F.event_entry_id  

【问题讨论】:

标签: sql sql-server tsql


【解决方案1】:

您可以使用 subselect 或 CTE 来获取按员工排序的数据并将其用作主数据表。与此类似(必要时进行调整):

;with ordered as (
select 
    emp_reader_id as empId,
    CONVERT(DATE, dt) as Punch,
    Row_number()
     OVER (PARTITION BY emp_reader_id ORDER BY CONVERT(DATE, dt) ASC) as OrderedPunch
from trnevents
)
SELECT 
    entered.empId, 
    entered.Punch as PunchIn,
    exited.Punch as PunchOut
from
    ordered as entered
    left join ordered as exited on 
        entered.empId = exited.empId
        and entered.OrderedPunch + 1 = exited.OrderedPunch

解释:“有序”CTE 确实显示了按日期排序的员工进入/退出。由于PARTITION BY,每个员工的ROW_NUMBER 都被重置(我假设emp_reader_id 确实包含员工ID)。

获得每个员工的计数器后,我将每个员工的每个打孔(左连接中的第一个条件)与该员工的下一个打孔(左连接中的第二个条件)连接起来。这样我就可以显示入口列和出口(下一拳)。

在您获得数据中的 in 和 out 列之后,您可能想要排除一些数据(每个员工的奇数行是您想要的行)添加 WHERE entered.OrderedPunch %2 = 1

【讨论】:

  • 可以简单解释一下
  • 已编辑问题添加说明
  • @bradbury9 这是您上述查询的输出 2018-10-20 17:35:14.000 2018-10-21 07:02:59.000 2018-10-21 07:02:59.000 2018-10- 21 17:35:38.000
猜你喜欢
  • 2020-10-08
  • 2012-07-02
  • 1970-01-01
  • 2020-11-22
  • 2011-12-13
  • 1970-01-01
  • 2011-12-09
相关资源
最近更新 更多