当前位置: 首页 > 面试题库 >

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

满俊楠
2023-03-14
问题内容

我正在尝试编写一个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)
  • html" target="_blank">日历季度(例如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”表中的所有内容,从而可以轻松按财务季度,月份,日期,星期几等进行报告。

希望有帮助!



 类似资料:
  • 我有一个表,其中存储了工资单记录及其创建日期。默认情况下,我想显示当前月份的记录。 我想查找当月的所有记录。有些单据可能在每月1日生成,有些在10日生成,但它应该显示给定月份的所有行。 我使用这个语句来获取本月第一天存储在表中的记录,但是2号或3号保存的记录呢?

  • 我想获得一个每月平均值,该平均值仅计算包含交易的月份。这就像将所有交易金额相加,然后除以使用的月数一样简单。 我找不到一个本机Excel公式可以像这样计算月份,并且尝试使用表或命名范围对基于ROW()函数的条件求和不起作用。它只会在尝试按年(或任何其他条件)限制计数时返回零。 该公式如下所示: 顺便说一句,这是一个数组公式。它基本上会查看您所在的行是否与排序列表中引用月份的第一行相同。这是我尝试过

  • 我想有一个日期选择器,用户可以从日期选择器中只选择月份和年份,我还需要限制从以前的日期选择器中选择月份和年份的下一个日期选择器... 有人能帮我解脱吗?

  • 问题 你的代码需要在当前月份中循环每一天,想找到一个计算这个日期范围的高效方法。 解决方案 在这样的日期上循环并需要事先构造一个包含所有日期的列表。 你可以先计算出开始日期和结束日期, 然后在你步进的时候使用 datetime.timedelta 对象递增这个日期变量即可。 下面是一个接受任意 datetime 对象并返回一个由当前月份开始日和下个月开始日组成的元组对象。 from datetim

  • 问题内容: 我使用Microsoft的想法来存储资源和预订信息。简而言之,诸如酒店房间之类的资源没有日期记录,预订记录具有BeginDate和EndDate。 我正在尝试使用MS的查询来检索房间可用性信息,但有一些情况告诉我MS的查询还有很多不足之处。这是我指的MS文章: http //support.microsoft.com/kb/245074 如何检索给定日期范围内的可用房间?这是我的查询,

  • 问题内容: 我需要找到给定月份和年份的所有周末日期。 例如:对于01(月),2010(年),输出应为:所有周末日期:2,3,9,10,16,17,23,24,30,31。 问题答案: 这是带有描述步骤的注释的粗略版本: