2015-04-05 58 views
-1

我有这样SQL查询来显示计时表

id Marca CodCartela Line Post status Time 
---- ------ ----------- ---- ---- ------ ----------------------- 
178 346 4516645709 AS01 55 1  2015-04-05 02:30:12.627 
179 346 4516645709 AS01 55 0  2015-04-05 02:31:23.593 
180 346 4516645709 AS01 88 1  2015-04-05 02:32:05.107 
181 346 4516645709 AS01 88 0  2015-04-05 02:32:22.060 

状态1的表装置IN和状态0表示OUT。 我想要的是在同一行上为每个人显示进出时间。 例

id Marca CodCartela Line Post status TimeIN     TimeOUT 
---- ---------------- ---- ---- ------ ----------------------------------------- 
178 346 4516645709 AS01 55 1  2015-04-05 02:30:12.627 2015-04-05 02:31:23.593 

这是可能的,或者我需要重新考虑所有的计时aplications :(

+0

哪个字段是人吗?它发布了吗?或ID? – jfun 2015-04-05 10:21:44

+0

Marca是为人 – 2015-04-05 10:46:32

+1

编辑你的问题,并添加一个标签与SQL Server的版本。有可能做你需要的东西,但效率很低。我个人在生成这种数据时会预处理这些数据,并且在同一行中同时存储“IN”和“OUT”,而不是将它们存储在两个单独的行中。正是由于这个原因 - 以后很难将它们重新组合起来。实际上,我把时间存储为“IN”和持续时间,而不是两次。我在UTC和当地时间存储不同类型报告的时间,但这与问题无关。 – 2015-04-05 12:06:15

回答

0

它使用简单conditional Aggregate

SELECT marca, 
     codcartela, 
     line, 
     post, 
     Max(CASE WHEN status = 1 THEN time END) AS TimeIN, 
     Max(CASE WHEN status = 0 THEN time END) AS TimeOUT 
FROM yourtable 
GROUP BY marca, 
      codcartela, 
      line, 
      post 
+0

该查询有效,但它只显示最后一个值。我需要将这样的所有值分组,而不仅仅是最后一个。就像拥有一个表进入循环 – 2015-04-05 10:29:49

0

我不知道究竟是怎么的模式结构,并没有得到你很好,我不知道,但根据您的样本数据和所需的输出,我认为你想这样的事情:

select t1.marca, 
     t1.codcartela, 
     t1.line, 
     t1.post, 
     t1.time as TimeIN, 
     t2.time as TimeOUT 
FROM table_name t1 
LEFT OUTER JOIN table_name t2 on t1.post=t2.post 
        and t1.marca = t2.marca 
WHERE t1.status=1 and isnull(t2.status,0)=0 

编辑:改变加入列马卡报提到它是人

+0

我只有一个表 – 2015-04-05 10:46:57

+0

@GeorgeFarcas,查询中只有一个表,t1和t2是该表的别名 – jfun 2015-04-05 11:00:34

+0

它的工作原理,但它也给了我也是周期之间的差异,它也计算ID 178到181,但它不应该。在当前的例子中,它应该显示2行不是4.一个是178-179,另一个是180-181。每行都会有状态1的TimeIN和状态0的Timeout – 2015-04-05 11:31:25

0

假设组合post, status是独一无二的,你可以做一个连接:

select 
    t1.* 
    ,t2.Time as timeOut 
from tab t1 
left join tab t2 
on t1.post = t2.post 
and t2.status = 0 
where t1.status = 1 

否则,你可能需要添加附加条件。

+0

我只有一个表 – 2015-04-05 10:46:43

+0

当然,当你看到它时,你会注意到同一个表被使用了两次(具有不同的别名),它被称为自连接... – dnoeth 2015-04-05 14:44:22

0

这将追踪每个人的Ins和Outs。只需将CTE中的表格切换到您的实际表名即可。

WITH CTE_yourTable 
AS 
(
    SELECT *, 
      ROW_NUMBER() OVER (PARTITION BY Marca ORDER BY [Time]) activity_num 
    FROM yourTable 
) 

SELECT A.ID, 
     A.Marca, 
     A.CodCartela, 
     A.[Line], 
     A.[Post], 
     --A.[Status], 
     A.[Time] AS TimeIn, 
     B.[Time] AS [TimeOut] 
FROM  CTE_yourTable A 
LEFT JOIN CTE_yourTable B 
ON A.Marca = B.Marca 
AND A.activity_num = B.activity_num - 1 
WHERE A.[Status] = 1 

结果:

ID   Marca  CodCartela        Line Post  TimeIn     TimeOut 
----------- ----------- --------------------------------------- ---- ----------- ---------------------- ---------------------- 
178   346   4516645709        AS01 55   2015-04-0502:30:12.627 2015-04-0502:31:23.593 
180   346   4516645709        AS01 88   2015-04-0502:32:05.107 2015-04-0502:32:22.060