当前位置:首页 > 行业动态 > 正文

按月求和mysql

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补充无数据的月份(需额外创建维度表)

注意事项

  1. 确保日期列类型为DATEDATETIME,字符串类型需先转换:
    STR_TO_DATE(date_str, '%Y-%m-%d') -处理'2023-11-01'格式字符串
  2. 分组字段需与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
0