2013-04-02 3 views
0

У меня есть таблица SQL Server 2005, который записывает каждый шаг процесса, как показано нижеобъединить несколько записей в одну строку

ResourceID EventType   Time 
ABC123  Job Activated  2013-01-08 10:01:31.000 
ABC123  Download Complete 2013-01-08 10:03:32.000 
ABC123  Job Complete  2013-01-08 10:07:42.000 
XYZ789  Job Activated  2013-01-08 12:05:11.000 
XYZ789  Download Complete 2013-01-08 12:08:52.000 
XYZ789  Job Complete  2013-01-08 12:14:21.000 

То, что я хотел бы сделать, это показать результат, который имеет одну строку для каждого ResourceID, который показывает время для каждого события.

ResourceID Job Activated    Download Complete  Job Complete 
ABC123  2013-01-08 10:01:31.000 2013-01-08 10:03:32.000 2013-01-08 10:07:42.000 
XYZ789  2013-01-08 12:05:11.000 2013-01-08 12:08:52.000 2013-01-08 12:14:21.000 

Любые предложения о том, как это сделать? Благодарю.

+0

Вы хотите использовать PIVOT. Я мобилен, поэтому я не могу написать его для вас. – rbedger

+1

Проверьте функцию 'PIVOT': http://msdn.microsoft.com/en-us/library/ms177410%28v=sql.105%29.aspx –

ответ

2

Как предложил комментарии, вы можете сделать это довольно легко с PIVOT:

DECLARE @x TABLE(ResourceID CHAR(6), EventType VARCHAR(32), [Time] DATETIME); 

INSERT @x SELECT 'ABC123','Job Activated ','2013-01-08 10:01:31.000' 
UNION ALL SELECT 'ABC123','Download Complete','2013-01-08 10:03:32.000' 
UNION ALL SELECT 'ABC123','Job Complete  ','2013-01-08 10:07:42.000' 
UNION ALL SELECT 'XYZ789','Job Activated ','2013-01-08 12:05:11.000' 
UNION ALL SELECT 'XYZ789','Download Complete','2013-01-08 12:08:52.000' 
UNION ALL SELECT 'XYZ789','Job Complete  ','2013-01-08 12:14:21.000'; 

SELECT ResourceID,[Job Activated],[Download Complete],[Job Complete] 
FROM @x 
PIVOT 
(
    MAX([Time]) FOR EventType IN (
    [Job Activated],[Download Complete],[Job Complete] 
)) AS p; 
+0

Я просто работал над своим ответом, черт вас за кражу моего pivot – Taryn

+0

@bluefeet эй, у вас не может быть 'ВСЕ'' PIVOT'. Я оставлю тебе тяжелые. :-) –

+0

О, я все равно отвечу, просто с альтернативами. :) – Taryn

2

Вы можете использовать агрегатную функцию с выражением CASE для поворота данных:

select resourceid, 
    max(case when EventType = 'Job Activated' then [time] end) as [Job Activated], 
    max(case when EventType = 'Download Complete' then [time] end) as [Download Complete], 
    max(case when EventType = 'Job Complete' then [time] end) as [Job Complete] 
from yourtable 
group by resourceid 

См SQL Fiddle with Demo.

Или вы можете использовать несколько объединений на вашем столе:

select ja.resourceid, 
    ja.[time] as [Job Activated], 
    dc.[time] as [Download Complete], 
    jc.[time] as [Job Complete] 
from yourtable ja 
left join yourtable dc 
    on ja.resourceid = dc.resourceid 
    and dc.EventType = 'Download Complete' 
left join yourtable jc 
    on ja.resourceid = jc.resourceid 
    and jc.EventType = 'Job Complete' 
where ja.EventType = 'Job Activated' 

См SQL Fiddle with Demo

Смежные вопросы