代码之家  ›  专栏  ›  技术社区  ›  Niclas Lindqvist

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

  •  5
  • Niclas Lindqvist  · 技术社区  · 15 年前

    我正在尝试编写一个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
    

    2 回复  |  直到 13 年前
        1
  •  6
  •   Dave Rix    14 年前

    我同意Lieven的回答,创建一个包含您可能需要的所有月份的表,并使用它“左联接”到您的结果表。记住,这是一个非常小的表,每年只有365行数据。。。您可以很容易地编写一些代码来填充这个表

    • 日期(例如2009-04-01)
    • 星期几(如星期三)
    • 月(如4)
    • 财政季度(例如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`
    

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

        2
  •  2
  •   Lieven Keersmaekers    15 年前

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