选择给定日期范围内的所有月份,包括值为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

回到顶部