Съгласен съм с отговора на Lieven, създайте таблица, съдържаща всички месеци, които някога бихте могли да изисквате, и я използвайте, за да „LEFT JOIN“ към вашата таблица с резултати. Не забравяйте, че това е наистина малка таблица, само 365(ish) реда на година данни, които имате... И можете лесно да напишете някакъв код, който да попълни тази таблица първоначално
Ние правим това тук и това дава много предимства, например, представете си месечна таблица с данни със следните полета (и всякакви други, за които се сетите!), напълно попълнени за всички месеци в даден диапазон;
- Дата (напр. 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 код, тъй като не успях да създам тестовите таблици, но се надявам, че ще получите главния и ще го промените според нуждите си!
Използвайки това, можете да промените клаузата си „GROUP BY“ на това, което имате в таблицата „dateTable“, което може да ви позволи лесно да отчитате по финансово тримесечие, месец, ден, ден от седмицата и т.н.
Надявам се това да помогне!