Zgadzam się z odpowiedzią Lievena, stwórz tabelę zawierającą wszystkie miesiące, których mógłbyś kiedykolwiek potrzebować, i użyj jej, aby „DOŁĄCZYĆ W LEWO” do tabeli wyników. Pamiętaj, że jest to naprawdę mała tabela, tylko 365(i) wierszy na rok danych, które masz... I możesz łatwo napisać kod, aby wstępnie wypełnić tę tabelę
Robimy to tutaj i daje to wiele korzyści, na przykład wyobraź sobie miesięczną tabelę danych z następującymi polami (i innymi, jakie możesz wymyślić!) w pełni wypełnioną dla wszystkich miesięcy w danym zakresie;
- Data (np. 2009-04-01)
- Dzień (np. 1)
- Dzień tygodnia (np. środa)
- Miesiąc (np. 4)
- Rok (np. 2009)
- Rok finansowy (np. 2009/10)
- Kwartał finansowy (np. I kwartał 2009 r.
- Kwartał kalendarzowy (np. 2009Q2)
Następnie połącz to z powyższym zapytaniem w następujący sposób;
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`
W moim kodzie SQL mogą występować błędy, ponieważ nie byłem w stanie utworzyć tabel testowych, ale mam nadzieję, że zdobędziesz zasadę i zmienisz ją zgodnie z własnymi potrzebami!
Korzystając z tego, możesz zmienić swoją klauzulę „GROUP BY” na dowolną z tabeli „dateTable”, która umożliwia łatwe raportowanie według kwartału finansowego, miesiąca, dnia, dnia tygodnia itp.
Mam nadzieję, że to pomoże!