Как правило, я рекомендую изменить ваш дизайн, чтобы не требовать этого. Но если вам это действительно нужно; Создавайте шаблоны для присоединения, это гарантирует, что у вас есть все нужные записи.
Возможно, у вас есть таблица календаря, в которой каждый день предварительно заполнен. И, может быть, почасовой стол с 24 часами заселения. Или одна таблица, составляющая все, что вам может понадобиться (год, месяц, неделя, день, час, интервал и т. Д. В виде различных столбцов, а затем с несколькими индексами покрытия) .
Даже в крайних случаях это обычно не занимает много места, и существенно упрощает запросы и (обычно) экономит значительное время обработки.
Затем вы получите что-то вроде этого ...
SELECT
calendar.date,
hours.hour,
SUM(SalesByHour.Sales) AS CumulativeSales,
MAX(CASE WHEN SalesByHour.Hour = hours.hour THEN Sales.Sales ELSE NULL END) AS Sales
FROM
calendar
CROSS JOIN
hours
LEFT JOIN
SalesByHour
ON SalesByHour.BusinessDate = calendar.date
AND SalesByHour.Hour <= hours.hour
GROUP BY
calendar.date,
hours.hour
Альтернатива - просто заполнить пробелы в вашем клиенте. Но это моё распределение определенной логики по клиенту и SQL. Точный лучший способ избежать этой потребности зависит от ситуации. Но я рекомендую найти способ не нуждаться в этом, если это все возможно.
То же самое относится и к совокупным значениям. Общеизвестно, что SQL плохо работает с такими суммами. Если клиент может обработать промежуточный итог вместо SQL, вы, вероятно, получите приличное общее снижение производительности.