【问题标题】:Create an Attendance view from one column timesheet (SQL Server 2008 R2)从一列时间表创建出勤视图 (SQL Server 2008 R2)
【发布时间】:2019-08-10 19:41:21
【问题描述】:

我有来自 SQL Server 的出勤数据,我必须将其分成 2 列(进出)。

这是一个例子:

The Data

这是我想要的结果

查询:

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. 可能会超时,所以有时我们必须检查第二天的结帐数据。

我该怎么做?

【问题讨论】:

  • 你尝试过什么?
  • 好吧,我已经尝试过加入连接,但我无法做到正确我是新手,所以我想不出任何其他方式......如果可以的话,我很抱歉除了图片,我什么都不支持你......
  • 欢迎来到 SO。请不要使用图像/图像链接,因为它使我们无法复制粘贴它们。最好的方法是为您的表格包含 CREATE TABLE 和 INSERT INTO 查询
  • 好的,我将添加 CREATE TABLE 和 INSERT INTO。谢谢。

标签: sql sql-server database sql-server-2008


【解决方案1】:

也许尝试从 Ins 到 outs 的左连接,并在该时间之后找到最早的 out 时间。

下面的示例(未经测试):

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;

【讨论】:

  • 它工作得很好,但如果加班到下一个日期,它就无法获取加班数据
  • @YandityaEkaputra 这就是使用设计不佳的模式的问题。当“工作时间”跨越一天的界限时,您没有明显的方法来识别“工作时间”。由于您是新手,因此您应该向您的队友、团队领导或主管寻求帮助。首先要做的是识别一组简单的样本数据,其中包含在一天内出现的一组“正常”行和一组跨越一天边界的行。您可以做出一些简化的假设。
  • 另一个问题是我是这里唯一的开发者。
  • @YandityaEkaputra,我不确定你所说的“如果加班到下一个日期的加班数据”是什么意思——你的意思是进出必须在同一天(这意味着如果当天没有结帐,out 可能为空)?如果是这样,我们只需要调整左连接条件以确保输入和输出在同一天......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-08
  • 1970-01-01
  • 1970-01-01
  • 2012-03-29
  • 2011-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多