Я бы попробовал использовать вспомогательную таблицу, которая будет содержать начальный час (столбец h1) и конечный час (столбец h2). Я использовал временную таблицу, но это может быть стандартная таблица или переменная таблицы. Отображение столбцов предназначено только для отображения.
Во-первых, я заполняю таблицу начальным и конечным часами, начиная с 0. Во-вторых, я использую DATEPART для определения часа заказа (order_start_time_T) и проверяю, вот какого периода зависит этот час.
h1 h2 display
--- --- ---
0 1 00:00 - 01:00
1 2 01:00 - 02:00
....
23 24 23:00 - 24:00
Запрос:
-- Populate time table
if object_id('tempdb..#t') is not null drop table #t
create table #t (
h1 tinyint,
h2 tinyint,
display varchar(30)
);
declare @i tinyint =0
while @i<24 begin
insert into #t (h1, h2, display) values(@i, @i+1
, case when @i<10 then '0' else '' end+cast(@i as varchar)
+':00 - ' + case when @i<9 then '0' else '' end+ cast(@i+1 as varchar)+':00')
set @i = @i + 1
end
-- Group per period
select count(*) [Count], t.display
from UDA_Order UDA INNER JOIN WORK_Order WO ON WO.order_key = UDA.object_key
JOIN #t t ON datepart(hour, order_start_time_T) between t.h1 and t.h2
where order_state = 'BOOKED' OR order_state = 'CLOSED'
GROUP BY t.display