Вы обычно достигаете такого типа вещей, присоединяясь к таблице значений , то есть к таблице, которая содержит все интересующие вас значения.
Типичные таблицы значений могут содержать, например, все целочисленные значения от 0 до 1000 или все даты для данного периода. Часто таблицы значений содержат больше значений, чем нужно, и мы получаем точный вывод, добавляя фильтры в предложении WHERE.
В этом случае вам потребуется таблица с датами. Предполагая, что эта таблица называется ValTableDates и что она содержит все даты в период с января 2005 года по декабрь 2010 года, запрос будет выглядеть следующим образом:
SELECT AVG(data) AS data, VT.ValDate
FROM ValTableDates VT
LEFT JOIN table T ON T.dateReg = VT.ValDate
WHERE VT.ValDate > [Some Start Date] and VT < [Some End Date]
GROUP BY YEAR(dateReg), MONTH(dateReg), DAY(dateReg)
ORDER BY dateReg
Приведенный выше запрос может потребовать некоторой настройки, чтобы получить значение Zero, а не NULL, но суть в том, что таблица значений, как правило, является самым простым способом предоставления выходных записей для отсутствующих точек данных.
Альтернативой является использование функции / выражения, которая создает желаемую последовательность [date] внутри подзапроса, но это, как правило, менее эффективно и более подвержено ошибкам.