6

我有一张桌子(但在很多地方):

DATE         STUFF
-------------------
2011-12-01   DATA
2011-12-02   DATA
2011-12-03   DATA
...
2011-12-31   DATA
2012-01-01   DATA
2012-01-02   DATA

我的表涵盖了从 2005 年到 2012 年的多年。我想获取每年中每个月的 AGGREGATE 函数值,即 SUM/AVG/MAX/MIN。简单的:

GROUP BY DATE_FORMAT(DATE, '%Y'), DATE_FORMAT(DATE, '%m')

我想在那些年的 3 个月时间段内做同样的事情......这适用于除一个以外的所有人:

GROUP BY DATE_FORMAT(DATE, '%Y'), DATE_FORMAT(DATE, '%m') IN (12, 01, 02)

我的其他时间段有效,因为它们在同一年(03、04、05)、(06、07、08)和(09、10、11)......但上面的 GROUP BY 是在 2012 年 12 月分组2012 年 1 月/2 月。我的时间段必须是 2011 年 12 月和 2012 年 1 月/2 月、2010 年 12 月和 2011 年 1 月/2 月……

我想保持这个通用性,所以我不必更新日期跨度,以便将代码放在多个位置的存储过程中。

如果 MONTH 12,我试图通过将前一年移动一年来自行加入表格。这产生​​了不良结果。

4

5 回答 5

3
 GROUP BY floor((month(DATE) + year(DATE) * 12 -1 + %month_shift%) / %month_group_period%)

其中 %month_group_period% 在您的示例中是三 (3)
并且 %month_shift% 是一 (1) 以获得 12 月、1 月、2 月一起,依此类推

编辑: 这也适用于 5 个月(如果你愿意)

于 2012-08-13T16:10:07.023 回答
1

我在这里假设您真正想要做什么DATE_FORMAT(DATE, '%m') IN (12, 01, 02),但是:

SELECT IF(DATE_FORMAT(DATE, '%m') = 12, DATE_FORMAT(DATE, '%Y') + 1, DATE_FORMAT(DATE, '%Y')) AS yr, 
    CASE DATE_FORMAT(DATE, '%m')
        WHEN 12 THEN 1
        WHEN 1 THEN 1
        WHEN 2 THEN 1
        WHEN 3 THEN 2
        WHEN 4 THEN 2
        WHEN 5 THEN 2
        WHEN 6 THEN 3
        WHEN 7 THEN 3
        WHEN 8 THEN 3
        WHEN 9 THEN 4
        WHEN 10 THEN 4
        WHEN 11 THEN 4
    END AS qtr
FROM ...
GROUP BY IF(DATE_FORMAT(DATE, '%m') = 12, DATE_FORMAT(DATE, '%Y') + 1, DATE_FORMAT(DATE, '%Y')), 
    CASE DATE_FORMAT(DATE, '%m')
        WHEN 12 THEN 1
        WHEN 1 THEN 1
        WHEN 2 THEN 1
        WHEN 3 THEN 2
        WHEN 4 THEN 2
        WHEN 5 THEN 2
        WHEN 6 THEN 3
        WHEN 7 THEN 3
        WHEN 8 THEN 3
        WHEN 9 THEN 4
        WHEN 10 THEN 4
        WHEN 11 THEN 4
    END
于 2012-08-13T16:01:13.923 回答
0

我会尝试这样的事情:

GROUP BY DATE_FORMAT(IF(MONTH(`DATE`)=12,DATE_ADD(`DATE`,INTERVAL 1 YEAR),`DATE`),'%Y')
       , DATE_FORMAT(`DATE`,'%m')

基本上,如果月份是 12,则添加 1 年。

实际上,我倾向于这样做:

GROUP BY DATE_FORMAT(DATE_ADD(`DATE`,INTERVAL IF(MONTH(`DATE`)=12,1,0) YEAR),'%Y')
       , CASE WHEN MONTH(`DATE`) IN (12,1,2) THEN 1
              WHEN MONTH(`DATE`) IN (3,4,5) THEN 2
              WHEN MONTH(`DATE`) IN (6,7,8) THEN 3
              WHEN MONTH(`DATE`) IN (9,10,11) THEN 4
          END
于 2012-08-13T16:04:06.330 回答
0

我不认为你想使用GROUP BY你正在尝试的方式。你可能想这样写你的查询

SELECT MONTH(date) as `month`, SUM(stuff) as `sum`
FROM table
WHERE YEAR(date) IN ('2010', '2011', 2012')
GROUP BY `month`

GROUP BY 子句不是您应该过滤/格式化数据的地方。

当然,您可以使用任何您想要的聚合函数来代替 SUM。您也可以省略所有年份的 WHERE 子句,或根据需要修改要包含的年份。

如果你想要年份和月份,你可以像这样简单地修改查询:

SELECT YEAR(date) as `year`, MONTH(date) as `month`, SUM(stuff) as `sum`
FROM table
WHERE `year` IN ('2010', '2011', 2012')
GROUP BY `year`, `month`
于 2012-08-13T16:02:01.757 回答
0

您需要通过以下方式从该组的日期中减去一个月:

GROUP BY DATE_FORMAT(date_add(DATE,  interval 1 month), '%Y'),
         DATE_FORMAT(date_add(date, interval 1 month), '%m') IN (12, 01, 02)

您可能还必须修改选择。

select DATE_FORMAT(date_add(date_add(DATE,  interval 1 month), interval -1 month), '%Y'),
       DATE_FORMAT(date_add(date_add(date, interval 1 month), interval -1 month), '%m')
于 2012-08-13T16:03:01.107 回答