select指定date范围内的所有月份,包括具有0个值的月份

我试图写一个MySQL查询来获得每个月之间的平均值,对于给定date之间的所有月份。 我的想法是这样的:

查询,类似

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年4月份没有input任何值,但是我希望它在输出中显示为0,0值。 任何想法如何实现这一目标? 可以在MySQL内完成吗?

我同意列文的答案,创build一个包含您可能需要的所有月份的表格,并将其用于“join”结果表格。 请记住,这是一个非常小的表,每年只有365(ISH)行的数据…你可以很容易地写一些代码来填充这个表

我们在这里做这件事情,它给了很多好处,例如,想象一个月度数据表,其中包含以下字段(以及其他所有您能想到的数据)!

  • date(例如2009-04-01)
  • 日(例如1)
  • 星期几(例如星期三)
  • 月(例如4)
  • 年(例如2009年)
  • 财政年度(例如2009/10)
  • 财政季度(例如2009年第一季度)
  • 日历季度(例如2009Q2)

然后结合上面的查询,如下所示;

 SELECT`DT`.`myYear`,`DT`.`myMonth`, 
            AVG(`myTable`.`value1`)为avg_value_1, 
            AVG(`myTable`.`value2`)为avg_value_2

从`dateTable`作为DT
 LEFT JOIN myTable
    打开`dateTable`.`myDate` =`myTable`.`save_date`

 WHERE`dateTable`.`myDate` BETWEEN'2009-01-01'和'2009-07-01'

 GROUP BY`DT`.`myYear`,`DT`.`myMonth`

我的SQL代码中可能有一些错误,因为我还没有能够创buildtesting表,但是希望你能得到主体和修改以满足你的需求!

使用这个,您可以将您的“GROUP BY”条款更改为“dateTable”表格中的任何内容,这可以使您轻松地按财务季度,月份,date,星期几等进行报告。

希望有所帮助!

最简单的方法可能是创build一个包含月份和年份的date表,并将其与最终结果相结合。