Выберите все месяцы в пределах заданного промежутка времени, включая те, которые имеют значения 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?

    Я согласен с ответом Ливена создать таблицу, содержащую все месяцы, которые вы когда-либо могли потребовать, и использовать ее для «LEFT JOIN» в таблице результатов. Помните, что это действительно крошечная таблица, всего 365 (ish) строк в год данных, которые у вас есть … И вы можете легко написать код для заполнения этой таблицы вначале

    Мы делаем это здесь, и это дает много преимуществ, например, представьте себе ежемесячную таблицу данных со следующими полями (и любыми другими, о которых вы можете думать!), Полностью заполненными за все месяцы в данном диапазоне;

    • Дата (например, 2009-04-01)
    • День (например, 1)
    • День недели (например, среда)
    • Месяц (например, 4)
    • Год (например, 2009 год)
    • Финансовый год (например, 2009/10)
    • Финансовый квартал (например, 2009 год1)
    • Календарный квартал (например, 2009 кв.

    Затем, комбинируя это с вашим запросом выше, следующим образом;

     SELECT `DT`.`myYear`,` DT```myMonth`, 
                AVG (`myTable`.`value1`) как avg_value_1, 
                AVG (`myTable`.`value2`) как avg_value_2
    
     FROM `dateTable` как 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-коде могут быть некоторые ошибки, поскольку мне не удалось создать тестовые таблицы, но, надеюсь, вы получите принципал и измените его в соответствии с вашими потребностями!

    Используя это, вы можете изменить предложение «GROUP BY» на все, что у вас есть в таблице «dateTable», что позволяет легко отчитываться по финансовому кварталу, месяцу, дню, дню недели и т. Д.

    Надеюсь, это поможет!

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

    Давайте будем гением компьютера.