【问题标题】:SQL Code for Max and Min time based on condition ( IN / Out )基于条件的最大和最小时间的 SQL 代码(输入/输出)
【发布时间】:2019-03-31 08:52:12
【问题描述】:

我有一个如下表,我需要使用

获取另一个表查询

预期的查询返回

date Username "Min(sign_time)based on IN" "Max(sign_time)based on out"

原始表格

Sign_Date   Employee_UserName   Sign    Sign_Time
27-Mar-19   abdullah.shaaban    In      8:14
27-Mar-19   abdullah.shaaban    Out     15:32

【问题讨论】:

  • 您使用的是 SQL Server 还是 MS Access?

标签: sql sql-server ms-access-2016


【解决方案1】:

我认为对于相同的日期/用户组合,IN 时间戳总是小于 OUT 时间戳,对吧?总是有一个 IN 在第一个,总是一个 out 条目是最后一个?

如果是这样,你可以使用这个:

select 
   Sign_Date, 
   Employee_UserName, 
   Min(Sign_Time) as IN, 
   Max(Sign_Time) as Out
from Table
group by Sign_Date, Employee_UserName

【讨论】:

    【解决方案2】:

    如果您确定使用 MS Access,则可以使用带有 iif 语句的条件聚合,例如:

    select 
        t.sign_date, 
        t.employee_username, 
        min(iif(t.sign = 'In', t.sign_time, null)) as intime,
        max(iif(t.sign = 'Out', t.sign_time, null)) as outtime
    from
        YourTable t
    group by
        t.sign_date, 
        t.employee_username
    

    另一种解决方案是使用两个相关的子查询:

    select
        t.sign_date,
        t.employee_username,
        (
            select min(u.sign_time)
            from YourTable u 
            where
                u.sign_date = t.sign_date and
                u.employee_username = t.employee_username and
                u.sign = 'In'
        ) as intime,
        (
            select max(u.sign_time) 
            from YourTable u 
            where 
                u.sign_date = t.sign_date and
                u.employee_username = t.employee_username and 
                u.sign = 'Out'
        ) as outtime
    from
        YourTable t
    group by
        t.sign_date, 
        t.employee_username
    

    或者,您可以使用连接:

    select 
        a.sign_date, 
        a.employee_username, 
        b.intime, 
        c.outtime
    from
        (
            (
                select distinct t.sign_date, t.employee_username
                from YourTable t
            ) a
            left join
            (
                select t.sign_date, t.employee_username, min(t.sign_time) as intime
                from YourTable t
                where t.sign = 'In'
                group by t.sign_date, t.employee_username
            ) b
            on a.sign_date = b.sign_date and a.employee_username = b.employee_username
        )
        left join
        (
            select t.sign_date, t.employee_username, max(t.sign_time) as outtime
            from YourTable t
            where t.sign = 'Out'
            group by t.sign_date, t.employee_username
        ) c
        on a.sign_date = c.sign_date and a.employee_username = c.employee_username
    

    在上述每一项中,将所有出现的YourTable 更改为您的表的名称。

    语法适用于 MS Access,因为 SQL Server 和 MS Access 都被标记了。

    【讨论】:

      猜你喜欢
      • 2013-02-26
      • 1970-01-01
      • 1970-01-01
      • 2017-08-17
      • 1970-01-01
      • 2020-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多