从一个列时间表创建一个出勤视图(SQL Server 2008 R2)

问题描述 投票:1回答:1

我有从SQL Server出席的这些数据,我必须分成2列(进出)。

这是一个例子:

The Data

这是我想要的结果

enter image description here

查询:

CREATE TABLE [dbo].[Table1]
(
    [ID] [varchar](50) NULL,
    [DATETIME] [datetime] NULL,
    [Flag] [int] NULL
)

INSERT INTO table1 
VALUES ('ID-1', '2019-03-13 09:48:00.000', '2'),
       ('ID-1', '2019-03-13 09:48:00.000', '2'),
       ('ID-1', '2019-03-13 18:11:00.000', '3'),
       ('ID-1', '2019-03-13 18:11:00.000', '3'),
       ('ID-1', '2019-03-14 02:00:00.000', '3'),
       ('ID-1', '2019-03-14 09:54:00.000', '2'),
       ('ID-1', '2019-03-14 09:54:00.000', '2'),
       ('ID-1', '2019-03-14 09:54:00.000', '2'),
       ('ID-1', '2019-03-14 22:00:00.000', '3'),
       ('ID-1', '2019-03-14 22:00:00.000', '3'),
       ('ID-1', '2019-03-14 22:00:00.000', '3'),
       ('ID-1', '2019-03-15 13:55:00.000', '2'),
       ('ID-1', '2019-03-15 13:55:00.000', '2'),
       ('ID-1', '2019-03-15 13:55:00.000', '2'),
       ('ID-1', '2019-03-15 13:55:00.000', '2'),
       ('ID-1', '2019-03-15 13:55:00.000', '2'),
       ('ID-1', '2019-03-15 22:00:00.000', '3'),
       ('ID-1', '2019-03-15 22:00:00.000', '3'),
       ('ID-1', '2019-03-15 22:00:00.000', '3'),
       ('ID-1', '2019-03-15 22:00:00.000', '3')

注意:

  1. 标志2表示IN,3表示OUT。
  2. 可以有多个入住和退房,所以我们必须先进入和退出。
  3. 可能会有加班,所以有时我们必须检查第二天的结账数据。

我怎样才能做到这一点?

sql sql-server database sql-server-2008
1个回答
0
投票

也许尝试从Ins到出局的左连接,并在那之后找到最早的时间。

以下样本(未经测试):

WITH ins
AS ( SELECT *
     FROM   table1
     WHERE  Flag = 2 )
    ,outs
AS ( SELECT *
     FROM   table1
     WHERE  Flag = 3 )
SELECT   i.ID
        ,i.DATETIME InTime
        ,MIN(o.DATETIME) OutTime
FROM     ins i
         LEFT JOIN outs o ON o.ID = i.ID AND o.DATETIME > i.DATETIME -- out must be later than in
GROUP BY i.ID
        ,i.DATETIME
        ,i.Flag;
© www.soinside.com 2019 - 2024. All rights reserved.