Eu concordo com a resposta de Lieven, crie uma tabela contendo todos os meses que você poderia precisar e use isso para "LEFT JOIN" para sua tabela de resultados. Lembre-se, esta é uma tabela muito pequena, apenas 365 (ish) linhas por ano de dados que você tem ... E você pode facilmente escrever algum código para preencher esta tabela inicialmente
Fazemos isso aqui, e isso traz muitos benefícios, por exemplo, imagine uma tabela de dados mensal com os seguintes campos (e quaisquer outros que você possa imaginar!) totalmente preenchidos para todos os meses em um determinado intervalo;
- Data (por exemplo, 01-04-2009)
- Dia (por exemplo, 1)
- Dia da semana (por exemplo, quarta-feira)
- Mês (por exemplo, 4)
- Ano (por exemplo, 2009)
- Ano financeiro (por exemplo, 2009/10)
- Trimestre financeiro (por exemplo, 1º trimestre de 2009)
- Trimestre do calendário (por exemplo, 2º trimestre de 2009)
Em seguida, combine isso com sua consulta acima, da seguinte maneira;
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`
Pode haver alguns erros no meu código SQL, pois não consegui criar as tabelas de teste, mas espero que você obtenha o principal e altere para atender às suas necessidades!
Usando isso, você pode alterar sua cláusula "GROUP BY" para o que tiver na tabela "dateTable", o que pode permitir que você relate facilmente por Trimestre Financeiro, Mês, Dia, Dia da Semana, etc.
Espero que ajude!