SQL报Subquery returned more than 1 value错误及分组均值查询实现
问题根因
你在SELECT子句中写的标量子查询带了GROUP BY Branch,会返回所有门店的平均销售额(有多少个门店就返回多少行结果),而标量子查询作为输出列时要求单条记录只能匹配返回1个值,因此触发报错。
修正代码
两种可直接运行的写法均能实现需求,可根据自己的数据库版本选择:
方案1:全版本兼容的关联子查询写法
给子查询增加内外表的门店关联条件,去掉子查询内多余的分组逻辑,让子查询每行只返回当前记录对应门店的月均值:
SELECT Date, Branch, Total AS [day total], CAST( (SELECT AVG(Total) FROM MaySales AS sub WHERE sub.Branch = main.Branch) AS INT ) AS [monthly avg], CASE WHEN Total < (SELECT AVG(Total) FROM MaySales AS sub WHERE sub.Branch = main.Branch) THEN '低于平均值' WHEN Total = (SELECT AVG(Total) FROM MaySales AS sub WHERE sub.Branch = main.Branch) THEN '等于平均值' ELSE '高于平均值' END AS [case statement] FROM MaySales AS main
方案2:窗口函数写法(简洁高效,推荐)
如果你的数据库支持窗口函数(SQL Server 2008R2+、MySQL 8.0+、PostgreSQL等主流新版本数据库均支持),直接用分区聚合实现,不需要写重复子查询,执行性能更好:
SELECT Date, Branch, Total AS [day total], CAST(AVG(Total) OVER(PARTITION BY Branch) AS INT) AS [monthly avg], CASE WHEN Total < AVG(Total) OVER(PARTITION BY Branch) THEN '低于平均值' WHEN Total = AVG(Total) OVER(PARTITION BY Branch) THEN '等于平均值' ELSE '高于平均值' END AS [case statement] FROM MaySales
效果说明
以上代码执行后返回结构完全匹配预期:
- 同一家门店的所有日销记录,会统一展示该门店的月均销售额
- 对比列自动完成日销额和门店月均的判断,返回对应文案
- 月均值已做整数转换,符合字段格式要求
内容的提问来源于stack exchange,提问作者Ahmed
相关产品推荐
相关产品推荐

