возвращает нули для дат, которых не существует MYSQL GROUP BY - PullRequest
3 голосов
/ 26 января 2010
SELECT AVG(data) AS data, dateReg 
FROM table 
GROUP BY YEAR(dateReg), MONTH(dateReg), DAY(dateReg) ORDER BY dateReg

Вышеуказанные данные возвращаются

1.75, 21 Jan 2010
9.45, 22 Jan 2010
3.96, 23 Jan 2010
2.68, 30 Jan 2010

Пропущенные даты с 24 по 29, Можем ли мы сделать это, чтобы возвращаемое значение было:

1.75, 21 Jan 2010
9.45, 22 Jan 2010
3.96, 23 Jan 2010
0, 24 Jan 2010
0, 25 Jan 2010
0, 26 Jan 2010
0, 27 Jan 2010
0, 28 Jan 2010
0, 28 Jan 2010
2.68, 30 Jan 2010

1 Ответ

5 голосов
/ 26 января 2010

Вы обычно достигаете такого типа вещей, присоединяясь к таблице значений , то есть к таблице, которая содержит все интересующие вас значения.

Типичные таблицы значений могут содержать, например, все целочисленные значения от 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] внутри подзапроса, но это, как правило, менее эффективно и более подвержено ошибкам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...