As Luc said, the filter in the
WHERE
clause turns your
LEFT JOIN
into an
INNER JOIN
.
The simplest solution is to put the filter in the join conditions rather than the
WHERE
clause:
SELECT Dim_Hours.Id, SUM(Sales.Sale) AS Sales
FROM Dim_Hours
LEFT OUTER JOIN Sales
ON Dim_Hours.Id = DATEPART(hour, Sales.DateTimeSale)
AND Sales.DateTimeSale BETWEEN '2022-1-1' AND '2022-1-31'
GROUP BY Dim_Hours.Id
ORDER BY Id