Shazam!
create table Item(ID int, Description varchar(200),createdby varchar(20))
create table ItemLog(ID int, ItemID int, NewStatus varchar(200), [TimeStamp] datetime, ChangedBy varchar(20))
insert into Item(ID,Description,CreatedBy) values(1, 'Test 1', 'User1')
insert into Item(ID,Description,CreatedBy) values(2, 'Test 2', 'User1')
insert into Item(ID,Description,CreatedBy) values(3, 'Test 3', 'User1')
insert into ItemLog(ID, ItemID, NewStatus, TimeStamp, ChangedBy)
values(1,1,'Created','1/1/2012','User1')
insert into ItemLog(ID, ItemID, NewStatus, TimeStamp, ChangedBy)
values(2,1,'Pended','1/2/2012','User2')
insert into ItemLog(ID, ItemID, NewStatus, TimeStamp, ChangedBy)
values(3,1,'Completed','1/3/2012','User2')
insert into ItemLog(ID, ItemID, NewStatus, TimeStamp, ChangedBy)
values(4,2,'Created','1/1/2012','User2')
insert into ItemLog(ID, ItemID, NewStatus, TimeStamp, ChangedBy)
values(5,2,'Pended','1/2/2012','User3')
insert into ItemLog(ID, ItemID, NewStatus, TimeStamp, ChangedBy)
values(6,3,'Cancelled','1/9/2012','User1')
insert into ItemLog(ID, ItemID, NewStatus, TimeStamp, ChangedBy)
values(7,3,'Created','1/2/2012','User1')
insert into ItemLog(ID, ItemID, NewStatus, TimeStamp, ChangedBy)
values(8,3,'Pended','1/2/2012','User1')
select * from item i left outer join itemlog il on il.ItemID = i.ID
select
i.Description,
FirstStatusDate=minIL.TimeStamp,
CurrentStatus=maxIL.NewStatus,
CurrentStatusDate=maxIL.TimeStamp,
CurrentUser=maxIL.ChangedBy,
CompletedDate=(select max(TimeStamp) from ItemLog where ItemID=i.ID and NewStatus='Completed'),
[TotalTime (in days)]=case
when
minIL.TimeStamp is not null and maxIL.TimeStamp is not null
then datediff(day,minIL.TimeStamp,maxIL.TimeStamp)
else
convert(int,null)
end,
TimePending=sum(c.Days)
from
Item i
left outer join
(
select
y.ItemID,
y.MinDate,MinItemLogID=min(mn.id),
y.MaxDate,MaxItemLogID=max(mx.id)
from
(
select
ItemID,MinDate=min(timestamp), MaxDate=max(timestamp)
from
ItemLog il group by ItemID
) as y
left outer join ItemLog mn on mn.ItemID=y.ItemID and mn.TimeStamp=y.MinDate
left outer join ItemLog mx on mx.ItemID=y.ItemID and mx.TimeStamp=y.MaxDate
group by
y.ItemID, y.MinDate, y.MaxDate
)
z on z.ItemID = i.ID
left outer join ItemLog minIL on minIL.ID = z.MinItemLogID
left outer join ItemLog maxIL on maxIL.ID = z.MaxItemLogID
left outer join
(
select
p.ItemId,
PendTime=p.TimeStamp,
PendID=p.ID,
Days=datediff(day,p.TimeStamp,
coalesce(
(select min(TimeStamp)
from
ItemLog b
where
b.ItemID = P.ItemID and TimeStamp > p.TimeStamp )
,
getdate()
)
)
from
ItemLog p
where
p.NewStatus='Pended'
) c on c.ItemID = i.ID
group by
i.ID,
i.Description,
minIL.TimeStamp,
maxIL.NewStatus,
maxIL.TimeStamp,
maxIL.ChangedBy