小编典典

选择给定日期范围内的所有月份,包括值为0的月份

mysql

我正在尝试编写一个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中完成吗?


阅读 468

收藏
2020-05-17

共1个答案

小编典典

我同意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”表中的所有内容,从而可以轻松按财务季度,月份,日期,星期几等进行报告。

希望有帮助!

2020-05-17