Выберите все месяцы в заданном диапазоне даты, в том числе с 0 значениями 0
Вопрос
Я пытаюсь написать запрос MySQL, чтобы получить среднее значение в месяц, на все месяцы между данными датами. Моя идея такова:
Запрос, что -то вроде
SELECT AVG(value1) as avg_value_1,
AVG(value2) as avg_value_2,
MONTH(save_date) as month,
YEAR(save_date) as year
FROM myTable
WHERE save_date BETWEEN '2009-01-01' AND '2009-07-01'
GROUP BY YEAR(save_date), MONTH(save_date)
avg_value_1 | avg_value_2 | month | year
5 | 4 | 1 | 2009
2 | 1 | 2 | 2009
7 | 5 | 3 | 2009
0 | 0 | 4 | 2009 <---
6 | 5 | 5 | 2009
3 | 6 | 6 | 2009
Видите ли, в апреле 2009 года не было введено значения, но я хочу, чтобы они отображались как значение 0, 0 в выводе. Есть идеи о том, как это достичь? Можно ли это сделать в MySQL?
Решение
Я согласен с ответом Лиена создать таблицу, содержащую все месяцы, которые вам когда -либо потребовались, и использовать ее, чтобы «оставить присоединение» к вашей таблице результатов. Помните, что это действительно крошечная таблица, только 365 (иш) строк в год, которые у вас есть ... и вы можете легко написать код для заполнения этой таблицы изначально
Мы сделаем это здесь, и это дает много преимуществ, например, представьте себе ежемесячную таблицу данных со следующими полями (и любыми другими, которые вы можете подумать!) Полностью заполнены для всех месяцев в данном диапазоне;
- Дата (например, 2009-04-01)
- День (например, 1)
- День недели (например, среда)
- Месяц (например, 4)
- Год (например, 2009)
- Финансовый год (например, 2009/10)
- Финансовый квартал (например, 2009Q1)
- Календарный квартал (например, 2009q2)
Затем сочетая это с вашим запросом выше, следующим образом;
SELECT `DT`.`myYear`, `DT`.`myMonth`, AVG(`myTable`.`value1`) as avg_value_1, AVG(`myTable`.`value2`) as avg_value_2 FROM `dateTable` as DT LEFT JOIN `myTable` ON `dateTable`.`myDate` = `myTable`.`save_date` WHERE `dateTable`.`myDate` BETWEEN '2009-01-01' AND '2009-07-01' GROUP BY `DT`.`myYear`, `DT`.`myMonth`
В моем коде SQL может возникнуть некоторые ошибки, так как я не смог создать тестовые таблицы, но, надеюсь, вы получите принципал и изменить в соответствии с вашими потребностями!
Используя это, вы можете изменить предложение «Группа по» тому, что у вас есть в таблице «DateTable», которая может позволить вам легко сообщать по финансовому кварталу, месяце, день, день недели и т. Д.
Надеюсь, это поможет!
Другие советы
Самый простой способ, вероятно, состоит в том, чтобы создать таблицу даты, содержащие месяцы и годы и союз этого с вашим окончательным результатом.