Какой SQL запрос использовать для графика по часам?

Подскажите как правильно составить SQL запрос для построения графика по часам.
В настоящий момент использую такой запрос (MSSQL)

SELECT
COUNT(DISTINCT orderT.user) as Orders,
datepart(hh, orderT.date) as Hour
from orderT
where Operation = 'newOrder'
and orderT.date >= Convert(datetime, '2014-11-06 00:00:00') 
and orderT.date < Convert(datetime, '2014-11-06 23:59:59')
GROUP BY datepart(hh, orderT.date)


Результат такого запроса таблица (заказы и номер часа):
Orders : Hour
100 : 0
105 : 1
115 : 2
123 : 3
144 : 4
... итд за все 24 часа.


В данном случае все работает нормально, пока не появляются такие часы, по которым вообще нет данных. И тогда информация за этот час полностью выпадает из таблицы, что критично для графика.

Подскажите как составить запрос, что бы за тот час по которому нет данных
База отдавала номер часа и "0" в качестве результата!
  • Вопрос задан
  • 3625 просмотров
Пригласить эксперта
Ответы на вопрос 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Самое простое - не мучить базу, а изначально завести массив на 24 элемента, инициализировать его нулями а потом заполнить из базы используя номер часа как индекс.
Ну или делать
UNION (SELECT 0 as Orders, 0 as Hours)
UNION (SELECT 0 as Orders, 1 as Hours)
...
UNION (SELECT 0 as Orders, 23 as Hours)
Не знаю, как именно это будет записываться в MSSQL
Ответ написан
Комментировать
Если SQL сервер версии 2008 или старше, то можно сделать так:
SELECT
    COUNT(DISTINCT [orderT].[user]) as [Orders]
    , [Hours].[Hour]
FROM
    (
        VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12), (13), (14), (15), (16), (17), (18), (19), (20), (21), (22), (23)
    ) AS [Hours]([Hour])

LEFT OUTER JOIN
    [orderT]
ON
   datepart(hh, [orderT].[date]) = [Hours].[Hour]
WHERE
    [orderT].[Operation] LIKE 'newOrder'
    AND [orderT].[date] >= Convert(datetime, '2014-11-06 00:00:00') 
    AND [orderT].date < Convert(datetime, '2014-11-06 23:59:59')
GROUP BY
    [Hours].[Hour]
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы