Mysql 选择给定日期范围内的所有月份,包括值为0的月份
我正在尝试编写一个MySQL查询,以获得从给定日期到指定日期之间所有月份的每月平均值。我的想法是: 查询,类似于Mysql 选择给定日期范围内的所有月份,包括值为0的月份,mysql,date,group-by,between,Mysql,Date,Group By,Between,我正在尝试编写一个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
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
选择AVG(value1)作为AVG_值_1,
平均值(值2)作为平均值2,
月份(保存日期)为月份,
年(保存日期)为年
从myTable
其中保存日期介于“2009-01-01”和“2009-07-01”之间
按年份(保存日期)、月份(保存日期)分组
平均值1 |平均值2 |月|年
5 | 4 | 1 | 2009
2 | 1 | 2 | 2009
7 | 5 | 3 | 2009
0 | 0 | 4 | 2009最简单的方法可能是创建一个包含月份和年份的日期表,并将其与您的最终结果结合起来。我同意Lieven的回答创建一个包含您可能需要的所有月份的表,并使用该表“左连接”到结果表中。请记住,这是一个非常小的表,每年只有365(ish)行数据。。。您可以很容易地编写一些代码来填充这个表
我们在这里这样做,它提供了很多好处,例如,想象一个月度数据表,其中包含以下字段(以及您可以想到的任何其他字段!),在给定范围内的所有月份都完全填充
- 日期(如2009-04-01)
- 日(如1)
- 星期几(如星期三)
- 月份(如4个月)
- 年份(如2009年)
- 财政年度(如2009/10)
- 财政季度(如2009年第一季度)
- 日历季度(如2009年第二季度)
然后将其与上面的查询相结合,如下所示
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`
选择'DT`.'myYear`、'DT`.'myMonth`,
平均值(`myTable`.`value1`)作为平均值1,
平均值(`myTable`.`value2`)作为平均值
从'dateTable'开始,作为DT
左JOIN`myTable`
在'dateTable'上。'myDate`='myTable`.'save\u date`
其中“dateTable”。“myDate”介于“2009-01-01”和“2009-07-01”之间
按'DT`.'myYear`、'DT`.'myMonth`分组`
我的SQL代码中可能有一些错误,因为我无法创建测试表,但希望您能够获得主体并进行更改以满足您的需要
使用此选项,您可以将“GROUPBY”子句更改为“dateTable”表中的任何内容,从而可以方便地按财务季度、月份、日期、星期几等进行报告
希望有帮助 谢谢你的回复,但我真的需要一个包含所有可能日期的表格吗?这不是最简单的方法!:)很难返回不存在的值。:)Lieven说得很好,但是MySQL在使用普通的GetDate()和DateAdd()等时会记住所有的日期。。我只是觉得一定有办法把它们取回来!