2012-06-06 18 views
1

我從這個遺留錶轉換數據: MovTime(IdMov INT,IdPerson NVARCHAR(20),日期1日期時間,類型1爲nvarchar(30))噸-SQL我正在將數據變換

IdMov  IdPerson    Date1     Type 
----------- -------------------- ----------------------- ------------------------------ 
1   David    2012-06-01 09:00:00.000 Entered 
2   David    2012-06-01 12:30:00.000 Exit 
3   David    2012-06-01 14:00:00.000 Entered 
4   David    2012-06-01 18:30:00.000 Exit 
5   Kim     2012-06-02 09:00:00.000 Entered 
6   Kim     2012-06-02 12:00:00.000 Exit 

。 ..我想要的結果是以下幾點:

IdPerson  Data  Total Time 
---------- ---------- ---------- 
David  2012-06-01 08:00:00 
Kim   2012-06-02 03:00:00 

T-SQL

declare @WK_TABLE TABLE (IdMov INT, IdPerson NVARCHAR(20), Date1 datetime, Type1 nvarchar(30)) 

Insert into @WK_TABLE values(1,'David', '2012-06-01 09:00', 'Entered') 
Insert into @WK_TABLE values(2,'David', '2012-06-01 12:30', 'Exit') 
Insert into @WK_TABLE values(3,'David', '2012-06-01 14:00', 'Entered') 
Insert into @WK_TABLE values(4,'David', '2012-06-01 18:30', 'Exit') 
Insert into @WK_TABLE values(5,'Kim', '2012-06-02 09:00', 'Entered') 
Insert into @WK_TABLE values(6,'Kim', '2012-06-02 12:00', 'Exit') 


select * from @WK_TABLE 

有人可以幫我嗎?

+1

如果您有什麼happes進入並沒有相應的退出行? –

回答

1

假設無移位都不能超過24小時(例如延伸到次日),並且有一些約束防止行沒有相應的進入/退出:

;WITH x AS 
(
    SELECT IdPerson, Date1, Type1, rn = ROW_NUMBER() 
    OVER (PARTITION BY IdPerson ORDER BY Date1) 
    FROM @WK_TABLE 
) 
SELECT 
    x.IdPerson, [Data] = CONVERT(DATE, x.Date1), 
    [Total Time] = CONVERT(TIME(0), DATEADD(MINUTE, 
    SUM(DATEDIFF(MINUTE, x.Date1, x2.Date1)), '00:00:00')) 
FROM x INNER JOIN x AS x2 
ON x.IdPerson = x2.IdPerson 
AND x.rn = x2.rn - 1 
AND x.TYpe1 = 'Entered' AND x2.type1 = 'Exit' 
GROUP BY x.IdPerson, CONVERT(DATE, x.Date1) 
ORDER BY [Data], IdPerson; 
+0

非常感謝亞倫;)。 Works 100% –

+0

@Pankaj什麼是急於?也許更好的答案會出現。 –

+0

+1。很好的答案。 – 2012-06-06 18:03:17