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

Select语句使用AVG函数子查询报1242错误问题咨询

错误根因

你遇到的1242报错是因为SELECT列表中的子查询属于标量子查询,要求每次只能返回1行1列的结果,原语句中子查询加了GROUP BY pl.productline后会返回所有产品线对应的平均值(多行数),无法和外层主查询的每行一一匹配,因此触发报错。
如果删除子查询的GROUP BY,返回的是所有产品线的全局总平均值,自然无法实现按产品线分组统计的需求。

修正方案

将子查询改为关联子查询,增加与外层当前行的产品线匹配条件,让子查询每次仅计算当前行对应产品线的全局平均值即可,修正后的代码如下:

SELECT 
    pl.productline, 
    YEAR(orderdate), 
    SUM(quantityordered * priceeach) 'Revenue', 
    AVG(quantityordered * priceeach) as 'max rev', 
    MIN(quantityordered * priceeach) as 'min rev', 
    STD(quantityordered * priceeach) as 'std of rev', 
    COUNT(DISTINCT o.ordernumber) 'Annual # of Orders',
    (SELECT AVG(quantityordered * priceeach) as 'glob rev'
     FROM productlines pl_sub
     LEFT JOIN products p_sub ON pl_sub.productline = p_sub.productline
     LEFT JOIN orderdetails od_sub ON p_sub.productcode = od_sub.productcode
     -- 增加和外层的关联条件,仅计算当前产品线的平均值
     WHERE pl_sub.productline = pl.productline) 'avg global rev'
FROM 
    productlines pl
INNER JOIN 
    products p ON pl.productline = p.productline
INNER JOIN 
    orderdetails od ON p.productcode = od.productcode
INNER JOIN 
    orders o ON od.ordernumber = o.ordernumber
INNER JOIN 
    customers c ON o.customernumber = c.customernumber
WHERE 
    country = 'USA'
GROUP BY 
    pl.productline, YEAR(orderdate)
ORDER BY 
    productline;

如果你的「按产品线的全局平均值」要求统计范围和外层一致(仅统计美国区域的订单数据),也可以用窗口函数实现,语法更简洁:

SELECT 
    pl.productline, 
    YEAR(orderdate), 
    SUM(quantityordered * priceeach) 'Revenue', 
    AVG(quantityordered * priceeach) as 'max rev', 
    MIN(quantityordered * priceeach) as 'min rev', 
    STD(quantityordered * priceeach) as 'std of rev', 
    COUNT(DISTINCT o.ordernumber) 'Annual # of Orders',
    -- 窗口函数按productline分区,计算同产品线所有行的平均值
    AVG(quantityordered * priceeach) OVER(PARTITION BY pl.productline) 'avg global rev'
FROM 
    productlines pl
INNER JOIN 
    products p ON pl.productline = p.productline
INNER JOIN 
    orderdetails od ON p.productcode = od.productcode
INNER JOIN 
    orders o ON od.ordernumber = o.ordernumber
INNER JOIN 
    customers c ON o.customernumber = c.customernumber
WHERE 
    country = 'USA'
GROUP BY 
    pl.productline, YEAR(orderdate)
ORDER BY 
    productline;

内容的提问来源于stack exchange,提问作者user17577784

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 11:36:07