给出以下样本数据:
tblData
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月。
我该怎么做?
答案 0 :(得分:7)
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
并且没有格式化它,那么'我也会比较你不想要的日子,
答案 1 :(得分:2)
现在无法测试,但请试试这个:
SELECT
DATE_FORMAT(`Date`, '%Y-%m') AS yearMonth,
SUM(Sales)
FROM
yourTable
GROUP BY
yearMonth
HAVING
COUNT(*) = DAY(LAST_DAY(`Date`)