Lievenの回答に同意します。これまでに必要となる可能性のあるすべての月を含むテーブルを作成し、それを使用して結果テーブルに「LEFTJOIN」します。これは非常に小さなテーブルであり、1年に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」テーブルにあるものに変更できます。これにより、四半期、月、日、曜日などで簡単にレポートできます。
お役に立てば幸いです。