Something like this?DECLARE @sample TABLE ( CounterDateTime DATETIME , MachineName VARCHAR(25) , InstanceName VARCHAR(50) , CounterName VARCHAR(50) , CounterValue INT )INSERT @sampleVALUES ('2012-02-27 14:00:08.049', 'xxxxx01', 'Outlook.exe', 'Private Bytes', 125186048) , ('2012-02-27 14:15:08.049', 'xxxxx01', 'Outlook.exe', 'Private Bytes', 125186048) , ('2012-02-27 14:30:08.049', 'xxxxx01', 'Outlook.exe', 'Private BYTES', 126234624) , ('2012-02-27 14:31:08.049', 'xxxxx01', 'Outlook.exe', 'Private Bytes', 125186048) , ('2012-02-27 14:31:23.049', 'xxxxx01', 'Outlook.exe', 'Private Bytes', 126234624) , ('2012-02-27 14:31:38.049', 'xxxxx01', 'Outlook.exe', 'Private Bytes', 126234624) , ('2012-02-27 14:31:59.049', 'xxxxx01', 'Outlook.exe', 'Private Bytes', 126234624) , ('2012-02-27 14:54:10.049', 'xxxxx01', 'Outlook.exe', 'Private Bytes', 126234624)SELECT [DateToHour] , [HourSegment] , [MachineName] , [CounterName] , MAX([CounterValue]) AS [MaxCounterValue] , MIN([CounterValue]) AS [MinCounterValue] , AVG([CounterValue]) AS [AVGCounterValue]FROM ( SELECT DATEADD(HOUR, DATEDIFF(HOUR, '20100101', [CounterDateTime]), '20100101') AS [DateToHour] , (DATEPART(MINUTE, [CounterDateTime]) / 15) + 1 AS [HourSegment] , [MachineName] , [CounterName] , [CounterValue] FROM @sample ) AS sGROUP BY [DateToHour] , [HourSegment] , [MachineName] , [CounterName]Charlie===============================================================Msg 3903, Level 16, State 1, Line 1736The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION