Or you could group on {table.datetime} and choose "The section will be printed for each hour." Then choose "Customize group name"->"Use a formula to customize name"->x+2 and enter:
totext(time({Orders.Order Date})) +" to " + totext(time(dateadd("h",1,{Orders.Order Date})))
You might also think about whether it would be better to display non-overlapping groups, e.g., 12:00:00AM to 12:59:59AM, in which case you would change the second part of the formula to:
totext(time(dateadd("s",3599,{Orders.Order Date})))
Then you can right click on {table.qty} and insert a summary on it to get the group subtotals.
To get the average, I think you would need to use a variable. Create two formulas:
//{@accum} to be placed in the group header or footer for the hour group:
whileprintingrecords;
numbervar sumgrpqty := sumgrpqty + sum({table.qty},{table.datetime},"hourly");
numbervar counter := counter + 1;
//{@displayave} to be placed in the report footer:
whileprintingrecords;
numbervar sumgrpqty;
numbervar counter;
sumgrpqty/counter
-LB