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
相关产品推荐
相关产品推荐

