我正在尝试编写一个MySQL查询,以获取给定日期之间所有月份的每月平均值。我的想法是这样的:
查询,类似
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月没有输入任何值,但是我希望它在输出中显示为0、0值。关于如何实现这一目标的任何想法?可以在MySQL中完成吗?
我同意Lieven的回答,请创建一个表,其中包含您可能需要的所有月份,并使用该表将“ LEFT JOIN”到结果表。请记住,这是一个很小的表,每年只有365(ish)行数据……而且您可以轻松地编写一些代码来初始填充该表
我们在这里这样做,它带来了很多好处,例如,想象一个月度数据表,其中包含在给定范围内所有月份的以下字段(以及您可能想到的任何其他字段);
然后将其与上面的查询合并,如下所示;
选择`DT`.myYear`,`DT`.`myMonth`, AVG(`myTable`.`value1`)作为avg_value_1, AVG(`myTable`.`value2`)作为avg_value_2 从`dateTable`作为DT 左加入`myTable` 在`dateTable`.`myDate` =`myTable`.save_date` 在'2009-01-01'和'2009-07-01'之间的`dateTable`.`myDate`中 由DT分组。myYear,由DT分组myMonth。
由于我无法创建测试表,因此我的SQL代码中可能存在一些错误,但是希望您能够获取主体并进行更改以满足您的需求!
使用此功能,您可以将“ GROUP BY”子句更改为“ dateTable”表中的所有内容,从而可以轻松按财务季度,月份,日期,星期几等进行报告。
希望有帮助!