2015-04-05 33 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