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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 02:03:23