[英]How can I use same table and same column under different condition in SQL Server?
[英]How to can select the same column with two different condition SQL Server?
我有一个表test
包含这些列:
Id(int) AddAt (datetime) state (bit)
我有一个时间列表( clockIn
和clockOut
),我想将它们分开并创建名为ClockIn
和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 与一个人有关,我想让ClockIn
和ClockOut
兼容。
更新 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.