上一篇
按月求和mysql
- 行业动态
- 2025-05-17
- 3
SELECT DATE_FORMAT(date,’%Y-%m’) AS month,SUM(value) FROM table
MySQL按月求和实现方法
核心思路
通过日期函数提取年月信息,配合GROUP BY
对数据按月分组,使用SUM()
函数对目标字段求和。
常用日期函数
函数 | 作用 | 示例(结果) |
---|---|---|
DATE_FORMAT(date, '%Y-%m') | 提取年份和月份(格式:YYYY-MM) | 2023-11 |
YEAR(date) | 提取年份(数字) | 2023 |
MONTH(date) | 提取月份(数字) | 11 |
基础语法模板
SELECT DATE_FORMAT(date_column, '%Y-%m') AS month, SUM(numeric_column) AS total FROM table_name GROUP BY month ORDER BY month;
实战示例
表结构:sales
表(包含交易日期和金额)
| id | sale_date | amount |
|—-|————–|——–|
| 1 | 2023-11-01 | 100 |
| 2 | 2023-11-15 | 200 |
| 3 | 2023-12-05 | 300 |
查询语句:
SELECT DATE_FORMAT(sale_date, '%Y-%m') AS month, SUM(amount) AS total_sales FROM sales GROUP BY month ORDER BY month;
查询结果:
| month | total_sales |
|———|————-|
| 2023-11 | 300 |
| 2023-12 | 300 |
扩展场景处理
场景 | 解决方案 |
---|---|
包含时间字段的datetime | 用DATE() 包裹日期列:DATE(sale_date) |
跨年月份分组 | 必须使用%Y-%m 格式,避免不同年份的相同月份混淆(如2023-01 vs 2024-01) |
空月份填充 | 需关联日历表,用LEFT JOIN 补充无数据的月份(需额外创建维度表) |
注意事项
- 确保日期列类型为
DATE
或DATETIME
,字符串类型需先转换:STR_TO_DATE(date_str, '%Y-%m-%d') -处理'2023-11-01'格式字符串
- 分组字段需与
SELECT
中的日期格式完全一致。
相关问题与解答
问题1:如何按季度求和?
解答:
将DATE_FORMAT
改为季度格式'%Y-%q'
,或用QUARTER()
函数:
SELECT DATE_FORMAT(sale_date, '%Y-%q') AS quarter, SUM(amount) AS total FROM sales GROUP BY quarter;
问题2:日期字段是字符串类型(如’2023/11/01’),如何处理?
解答:
先用STR_TO_DATE
转换格式,再按月分组:
SELECT DATE_FORMAT(STR_TO_DATE(sale_date, '%Y/%m/%d'), '%Y-%m') AS month, SUM(amount) AS total FROM sales