如何按月份(1月、2月、3月等)对日期进行分组?附数据表示例
嗨,这个需求很常见,咱们可以借助SQL的日期处理函数提取月份,再配合分组或排序逻辑来实现。下面针对不同主流数据库,给你具体的实现方案:
一、SQL聚合分组(统计每月汇总数据)
如果需要按月份统计汇总信息(比如每月总销量、总金额、包含的商品),可以用以下方式:
MySQL 实现
SELECT DATE_FORMAT(date, '%c月') AS 月份, GROUP_CONCAT(name SEPARATOR ', ') AS 商品列表, SUM(quantity) AS 总数量, ROUND(SUM(quantity * price), 2) AS 总金额 FROM your_table -- 替换成你的表名 GROUP BY MONTH(date), DATE_FORMAT(date, '%c月') ORDER BY MONTH(date);
DATE_FORMAT(date, '%c月'):把日期格式化为「1月」「2月」这种中文月份格式GROUP_CONCAT:将同月份的商品名拼接成字符串,方便查看SUM:统计每月的总数量和总金额,ROUND用来保留两位小数GROUP BY同时按月份数值和格式化后的月份分组,确保排序逻辑正确
PostgreSQL 实现
SELECT TO_CHAR(date, 'MM"月"') AS 月份, STRING_AGG(name, ', ') AS 商品列表, SUM(quantity) AS 总数量, ROUND(SUM(quantity * price), 2) AS 总金额 FROM your_table GROUP BY EXTRACT(MONTH FROM date), TO_CHAR(date, 'MM"月"') ORDER BY EXTRACT(MONTH FROM date);
TO_CHAR(date, 'MM"月"'):实现中文月份格式化STRING_AGG是PostgreSQL自带的字符串聚合函数,功能类似MySQL的GROUP_CONCATEXTRACT(MONTH FROM date)提取月份数值,用于分组和排序
SQL Server 实现
SELECT FORMAT(date, 'MM月') AS 月份, STRING_AGG(name, ', ') AS 商品列表, SUM(quantity) AS 总数量, ROUND(SUM(quantity * price), 2) AS 总金额 FROM your_table GROUP BY DATEPART(month, date), FORMAT(date, 'MM月') ORDER BY DATEPART(month, date);
FORMAT(date, 'MM月'):SQL Server 2012+支持的格式化函数,直接生成中文月份STRING_AGG(SQL Server 2017+支持)用于聚合商品名DATEPART(month, date)提取月份数值,保证分组排序的准确性
二、按月份分组展示原始数据
如果只是需要把同月份的原始数据放在一起展示(不做聚合),可以先按月份排序,再在应用层处理分组:
SELECT name, date, quantity, price, DATE_FORMAT(date, '%c月') AS 月份 -- 不同数据库替换成对应格式化函数 FROM your_table ORDER BY MONTH(date);
查询结果会按1月、2月、3月的顺序排列,之后你可以在Python、Java等应用代码里遍历结果,当「月份」字段变化时,插入分组标题即可实现分组展示效果。
内容的提问来源于stack exchange,提问作者gokufast
相关产品推荐
相关产品推荐

