如何修正SQL以计算repairs表中所有记录的月度平均成本?
修复你的SQL:计算维修表的月度平均成本
嘿,我来帮你搞定这个SQL问题~先看看你原来的语句哪里出问题了:
你的子查询里只统计了每个月的记录数量count(*),完全没用到核心的cost字段,外层还试图对记录数求平均——这显然和你要的「月度平均成本」完全不沾边呀!
正确的解决方案分两种情况,看你具体需求:
需求1:按月份统计每个月的平均维修成本(最常用的场景,比如查看1月、2月各自的平均成本)
SELECT MONTH(start_date) AS month_number, -- 可选:添加月份名称让结果更直观,不同数据库写法略有差异 -- MySQL: MONTHNAME(start_date) AS month_name -- SQL Server: DATENAME(month, start_date) AS month_name -- PostgreSQL: TO_CHAR(start_date, 'Month') AS month_name AVG(cost) AS monthly_average_cost FROM repairs WHERE cost IS NOT NULL -- 排除成本为空的记录,避免拉低平均值 GROUP BY MONTH(start_date) -- 如果加了月份名称,分组也要加上:GROUP BY MONTH(start_date), month_name ORDER BY month_number;
需求2:计算所有月度平均成本的整体平均值(比如把每个月的平均成本再求一次平均)
如果你要的不是每个月的单独数据,而是所有月份平均成本的均值,可以用嵌套查询:
SELECT AVG(monthly_avg) AS overall_monthly_average FROM ( -- 先算出每个月的平均成本 SELECT AVG(cost) AS monthly_avg FROM repairs WHERE cost IS NOT NULL GROUP BY MONTH(start_date) ) AS monthly_averages;
关键注意点:
- 一定要过滤掉
cost IS NULL的记录,虽然AVG()函数会自动忽略空值,但显式写出来更清晰,也避免后续逻辑出错 - 如果你的数据跨年度,建议按年份+月份分组,比如
GROUP BY YEAR(start_date), MONTH(start_date),不然2023年1月和2024年1月会被合并计算
内容的提问来源于stack exchange,提问作者pfc1995
相关产品推荐
相关产品推荐

