5

给定以下示例数据:

数据

Date           Sales
----------------------
2011-12-01       122
2011-12-02       433
2011-12-03       213
...
2011-12-31       235

2011-11-01       122
2011-11-02       433
2011-11-03       213
...
2011-11-30       235

2011-10-10       122
2011-10-11       433
2011-10-12       213
...
2011-10-31       235

请注意,10 月的数据从 10 月 10 日开始,而随后的月份有完整的数据。

我需要获取所有完整月份的平均月销售额,在本例中为 2011 年 11 月和 12 月。

我该怎么做?

4

2 回答 2

10
SELECT `date`, AVG(`sales`)
FROM sales
GROUP BY YEAR(`date`), MONTH(`date`)
HAVING COUNT(`date`) = DAY(LAST_DAY(`date`));

例子

如果你想限制结果,要么

HAVING ...
ORDER BY `date` DESC LIMIT 3

它应该总是返回最近 3 个月的数据,或者类似的东西

FROM ...
WHERE DATE_FORMAT(CURDATE() - INTERVAL 3 MONTH, '%Y-%m')
   <= DATE_FORMAT(`date`, '%Y-%m')
GROUP BY ...

如果有的话,它应该返回前 3 个月的数据。我不确定哪个更好,但我不相信WHERE可以在 上使用任何索引date,如果您正在使用DATETIME并且不格式化它,您还将比较日期并且您不希望那样,

于 2012-08-20T09:40:49.463 回答
2

目前无法测试,但请尝试一下:

SELECT 
    DATE_FORMAT(`Date`, '%Y-%m') AS yearMonth,
    SUM(Sales)
FROM
    yourTable
GROUP BY 
    yearMonth
HAVING 
    COUNT(*) = DAY(LAST_DAY(`Date`)
于 2012-08-20T09:27:30.940 回答