选择给定日期范围内的所有月份,包括值为0的月份
我正在尝试编写一个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)行数据……而且您可以轻松地编写一些代码来初始填充该表
我们在这里这样做,它带来了很多好处,例如,想象一个月度数据表,其中包含在给定范围内所有月份的以下字段(以及您可能想到的任何其他字段);
- 日期(例如2009-04-01)
- 天(例如1)
- 星期几(例如星期三)
- 月(例如4)
- 年(例如2009年)
- 财政年度(例如2009/10)
- 财务季度(例如2009Q1)
- 日历季度(例如2009Q2)
然后将其与上面的查询合并,如下所示;
选择`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”表中的所有内容,从而可以轻松按财务季度,月份,日期,星期几等进行报告。
希望有帮助!
以上是 选择给定日期范围内的所有月份,包括值为0的月份 的全部内容, 来源链接: utcz.com/qa/413820.html