繁体   English   中英

如何在 select 同一列具有两个不同的条件 SQL 服务器?

[英]How to can select the same column with two different condition SQL Server?

我有一个表test包含这些列:

Id(int)     AddAt (datetime)     state (bit)

我有一个时间列表( clockInclockOut ),我想将它们分开并创建名为ClockInClockOut的新列。

  • 如果 state = 0,则 select AddAt 作为 ClockIn
  • 如果 state = 1,则 select AddAt 作为 ClockOut

我试过的:

select 
    Id,
    (select AddAt from test where state = 0) as ClockIn,
    (select AddAt from test where state = 1) as ClockOut
from 
    test 

但这对我不起作用。 我该怎么做才能让它发挥作用?

更新:

测试解决方案后,我得到了这个结果。 它似乎有效,但我想替换这些Null值,因为该 ID 与一个人有关,我想让ClockInClockOut兼容。

在此处输入图像描述

更新 2:

在测试了LEAD\LAG解决方案后,这就是我得到的:

在此处输入图像描述

我将尝试解释我究竟需要什么,这是解决方案的结果(case max),我现在需要的是总结数据(见下图),我试图只为 ID = 获取一行1 并且只有一行 ID = 2,为什么我得到 NULL 值???

在此处输入图像描述

我得到了什么:

    id  employee_code   status          created

1   EMP0001         check_in        2016-08-20 09:30:30
2   EMP0001         check_out       2016-08-20 18:15:00
3   EMP0002         check_in        2016-08-21 14:52:48
4   EMP0002         check_out       2016-08-21 21:09:18

预期结果

employee_code   check_in_at            check_out_at           total_time

EMP0002         2016-08-21 14:52:48    2016-08-21 21:09:18    06:16:30
EMP0001         2016-08-20 09:30:30    2016-08-20 18:15:00    08:44:30

我怎样才能做到这一点???

我已经多次编辑我的问题,但我没有得到我的问题的答案??!!!!!!

天真地,条件聚合可以做你想做的事:

select Id,
       max(case when state = 0 then addat end) as  ClockIn,
       max(case when state = 1 then addat end) as ClockOut
from test 
group by id;

我说“天真”是因为您还没有真正指定数据的样子(通过给出示例)以及您真正想要的结果。

由于您没有任何要测试的数据,因此我无法对其进行测试,但这是我认为您需要的

select id,
       case when state = 0 then AddAt else null end ClockIIn,
       case when state = 1 then AddAt else null end ClockIOut
  from test;

我认为您在这里需要LEAD/LAG

编辑 2:似乎Id列是主键,有一个employee_code是外键,我们需要结果是PARTITION BY employee_code

select 
    employee_code,
    ClockIn,
    ClockOut
from (
    select 
        employee_code,
        created as ClockIn,
        Status,
        LEAD(CASE WHEN status = 'check_out' THEN created END) OVER (PARTITION BY employee_code ORDER BY created) as ClockOut
    from test
) t
WHERE t.Status = 'check_in';

如果您想要每个employee_code的总打卡时间,您可以GROUP BY employee_code然后select SUM(DATEDIFF(second, ClockIn, ClockOut))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM