在单条SQL查询中同时计算平均值与求和的实现问题
解决方案
直接在单条分组查询中计算月度总和,再结合当月天数得到你需要的日均平均值(AVERAGETOTAL),无需嵌套分组:
SELECT id, DATE_TRUNC('month', date_column) AS date_month, -- 按月份分组,不同数据库语法有差异 SUM(value_column) AS valuetotal, SUM(value_column) / DAY(LAST_DAY(date_column)) AS averagetotal FROM your_table GROUP BY id, DATE_TRUNC('month', date_column) ORDER BY id, date_month;
数据库适配说明
不同数据库的日期处理语法需做对应调整:
- MySQL:用
DATE_FORMAT(date_column, '%Y-%m-01')替代DATE_TRUNC('month', date_column),DAY(LAST_DAY(date_column))可直接使用 - Oracle:用
TRUNC(date_column, 'MM')作为月份分组字段,EXTRACT(DAY FROM LAST_DAY(date_column))获取当月天数 - SQL Server:用
DATEFROMPARTS(YEAR(date_column), MONTH(date_column), 1)作为月份分组字段,DAY(EOMONTH(date_column))获取当月天数
优化提示
如果需要保留两位小数,可对平均值计算做四舍五入处理:
ROUND(SUM(value_column) / DAY(LAST_DAY(date_column)), 2) AS averagetotal
以你提到的8月数据为例,SUM得到246.10,除以31天会直接得到7.94,完全符合需求。
内容的提问来源于stack exchange,提问作者Debbie Dippenaar
相关产品推荐
相关产品推荐

