如何使用MySQL查询仅统计当月来源ID对应的金额总和
解决方案:获取指定来源当月的金额总和
嗨,我来帮你调整这个查询~ 你原来的语句是把source='1'的所有数据按月份分组求和,但现在只需要当月的总和,那我们只需要在WHERE条件里精准过滤出当月的数据,再直接求和就可以啦,不需要GROUP BY了。
推荐写法(性能更优)
这种写法利用范围查询,能用上**for_date字段的索引**,数据量大的时候效率更高:
SELECT SUM(amount) AS amountSum FROM Flow WHERE source='1' AND for_date >= DATE_FORMAT(NOW(), '%Y-%m-01') AND for_date < DATE_FORMAT(NOW(), '%Y-%m-01') + INTERVAL 1 MONTH;
DATE_FORMAT(NOW(), '%Y-%m-01')会生成当月的第一天(比如现在是2024年5月,就返回2024-05-01)- 加上
INTERVAL 1 MONTH后得到下个月第一天,用<这个日期就能确保只包含当月的所有数据,不会漏掉最后一天的晚时段记录(比如2024-05-31 23:59:59也会被正确包含)
另一种写法(逻辑直观但性能稍差)
如果你的数据量不大,也可以用月份和年份匹配的方式,但这种写法因为用函数包裹了for_date,会导致字段上的索引失效:
SELECT SUM(amount) AS amountSum FROM Flow WHERE source='1' AND MONTH(for_date) = MONTH(NOW()) AND YEAR(for_date) = YEAR(NOW());
说明
两种写法都能得到source='1'当月的金额总和,但优先推荐第一种范围查询的方式,尤其是在表数据较多的时候,性能差异会很明显。
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

