First of all: NEVER use DATE, TIME, STATUS as the name of columns! There are reserved words for MS SQL!
In the below example, i change the names of columns and i use temporary table (# -> temporary).
IF NOT OBJECT_ID(N'#DeviceData',N'T') IS NULL
DROP TABLE #DeviceData
CREATE TABLE #DeviceData(FloorID INT, GATEID INT, ICARD INT, DATE_TIME DATETIME, STAT NVARCHAR(50))
INSERT INTO #DeviceData (FloorID, GATEID, ICARD, DATE_TIME, STAT)
VALUES (2, 4, 15580735, '06-08-12 09:47:52', 'IN')
INSERT INTO #DeviceData (FloorID, GATEID, ICARD, DATE_TIME, STAT)
VALUES (2, 3, 15580735, '06-08-12 10:05:54', 'OUT')
INSERT INTO #DeviceData (FloorID, GATEID, ICARD, DATE_TIME, STAT)
VALUES (1, 1, 15580735, '06-08-12 10:05:34', 'IN')
INSERT INTO #DeviceData (FloorID, GATEID, ICARD, DATE_TIME, STAT)
VALUES (2, 4, 15580735, '06-08-12 10:10:41', 'IN')
INSERT INTO #DeviceData (FloorID, GATEID, ICARD, DATE_TIME, STAT)
VALUES (1, 2, 15580735, '06-08-12 10:11:50', 'OUT')
INSERT INTO #DeviceData (FloorID, GATEID, ICARD, DATE_TIME, STAT)
VALUES (1, 1, 15580735, '06-08-12 10:12:52', 'IN')
INSERT INTO #DeviceData (FloorID, GATEID, ICARD, DATE_TIME, STAT)
VALUES (1, 2, 15580735, '06-08-12 10:47:00', 'IN')
INSERT INTO #DeviceData (FloorID, GATEID, ICARD, DATE_TIME, STAT)
VALUES (1, 2, 15580735, '06-08-12 10:47:01', 'OUT')
INSERT INTO #DeviceData (FloorID, GATEID, ICARD, DATE_TIME, STAT)
VALUES (2, 3, 15580735, '06-08-12 10:50:00', 'IN')
INSERT INTO #DeviceData (FloorID, GATEID, ICARD, DATE_TIME, STAT)
VALUES (2, 4, 15580735, '06-08-12 10:52:12', 'OUT')
INSERT INTO #DeviceData (FloorID, GATEID, ICARD, DATE_TIME, STAT)
VALUES (3, 5, 15580735, '06-08-12 10:52:01', 'IN')
INSERT INTO #DeviceData (FloorID, GATEID, ICARD, DATE_TIME, STAT)
VALUES (3, 6, 15580735, '06-08-12 10:52:01', 'OUT')
INSERT INTO #DeviceData (FloorID, GATEID, ICARD, DATE_TIME, STAT)
VALUES (3, 6, 15580735, '06-08-12 10:52:02', 'OUT')
DECLARE @cols NVARCHAR(100)
DECLARE @dt NVARCHAR(1000)
DECLARE @pt NVARCHAR(2000)
SET @cols = STUFF((SELECT DISTINCT '],[' + STAT
FROM #DeviceData
ORDER BY '],[' + STAT
FOR XML PATH('')),1,2,'') + ']'
SET @dt = 'SELECT * FROM #DeviceData'
SET @pt = 'SELECT FloorID, GATEID, ICARD, ' + @cols + ' ' +
'FROM (' + @dt + ') AS DT ' +
'PIVOT (MAX(DATE_TIME) FOR STAT IN(' + @cols + ')) AS PT ' +
'ORDER BY PT.ICARD '
EXEC (@pt)
DROP TABLE #DeviceData
Result:
FloorID | GATEID | ICARD | IN | OUT |
---|
1 | 1 | 15580735 | 2012-06-08 10:12:52.000 | NULL |
1 | 2 | 15580735 | 2012-06-08 10:47:00.000 | 2012-06-08 10:47:01.000 |
2 | 3 | 15580735 | 2012-06-08 10:50:00.000 | 2012-06-08 10:05:54.000 |
2 | 4 | 15580735 | 2012-06-08 10:10:41.000 | 2012-06-08 10:52:12.000 |
3 | 5 | 15580735 | 2012-06-08 10:52:01.000 | NULL |
3 | 6 | 15580735 | NULL | 2012-06-08 10:52:02.000 |
This is not exactly what you want, but this is the point to start ;)