5

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

4

2 回答 2

6

我同意 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`) as avg_value_2

FROM `dateTable` 作为 DT
左连接`myTable`
    ON `dateTable`.`myDate` = `myTable`.`save_date`

WHERE `dateTable`.`myDate` BETWEEN '2009-01-01' AND '2009-07-01'

GROUP BY `DT`.`myYear`, `DT`.`myMonth`

我的 SQL 代码中可能存在一些错误,因为我无法创建测试表,但希望您能获得主体并根据您的需要进行更改!

使用它,您可以将“GROUP BY”子句更改为“dateTable”表中的任何内容,这可以让您轻松按财务季度、月份、日期、星期几等进行报告。

希望有帮助!

于 2010-06-24T15:31:17.533 回答
2

最简单的方法可能是创建一个包含月份和年份的日期表,并将其与您的最终结果结合起来。

于 2010-06-22T14:17:37.313 回答