You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL如何统计GROUP BY分组结果行数并新增total_months列

SQL实现新增total_months统计列的方案

你可以直接通过窗口函数或者子查询关联的方式实现需求,不需要额外做二次查询:

写法1:窗口函数实现(推荐,适用于MySQL8.0+、SQL Server、PostgreSQL等支持窗口函数的数据库)

直接在SELECT子句中加COUNT(*) OVER()即可统计分组后的总行数,也就是你要的总月份数,写法最简洁:

SELECT MONTHNAME(start_date) AS month, 
       YEAR(start_date) AS year, 
       SUM(training_hour) AS man_hours,
       COUNT(*) OVER() AS total_months
 FROM wtr_training_record 
 WHERE start_date BETWEEN '2022-02-28' AND '2022-03-02'
 GROUP BY YEAR(start_date), MONTH(start_date)

注意:原SQL的GROUP BY仅按月份分组,如果查询范围跨年度会把不同年份的同月份数据错误合并,建议把YEAR(start_date)也加入分组字段,避免统计错误。

写法2:子查询关联实现(兼容MySQL5.x等不支持窗口函数的旧版本数据库)

先通过子查询统计出符合条件的总月份数,再和原分组查询做笛卡尔关联,把总数值带到每一行结果中:

SELECT 
  MONTHNAME(t.start_date) AS month, 
  YEAR(t.start_date) AS year, 
  SUM(t.training_hour) AS man_hours,
  m.total_months
FROM wtr_training_record t
CROSS JOIN (
  -- 子查询统计命中的总月份数
  SELECT COUNT(DISTINCT YEAR(start_date), MONTH(start_date)) AS total_months
  FROM wtr_training_record
  WHERE start_date BETWEEN '2022-02-28' AND '2022-03-02'
) m
WHERE t.start_date BETWEEN '2022-02-28' AND '2022-03-02'
GROUP BY YEAR(t.start_date), MONTH(t.start_date), m.total_months

以上两种写法执行后,你给出的时间范围查询结果中total_months列的返回值均为2,符合需求。

内容的提问来源于stack exchange,提问作者Tamil Selvan Arju

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 22:18:03