You didn't mention where you get the hour ranges from. If you have the actual time information you could use that for sorting. If you don't have it, perhaps you can generate the necessary ranges (and join the the relevant information for sum calculation etc). For example something like this could be used to generate the time ranges:
select *
from (select CAST('05:00' AS TIME) AS StartTime, CAST('07:00' AS TIME) AS EndTime UNION ALL
select CAST('08:00' AS TIME) AS StartTime, CAST('09:00' AS TIME) AS EndTime UNION ALL
select CAST('09:00' AS TIME) AS StartTime, CAST('10:00' AS TIME) AS EndTime UNION ALL
select CAST('10:00' AS TIME) AS StartTime, CAST('11:00' AS TIME) AS EndTime) times
order by times.StartTime