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

SQL分组计算平均分:筛选数学平均分高于英语的姓名及查询修正

修正后的SQL查询方案

原查询的问题

  • 子查询计算的是整个表的数学、英语平均分,不是每个用户各自的科目平均分,完全偏离需求
  • 错误使用了不存在的conv_price(price),表中只有Marks字段,应该用avg(marks)

正确解法一:条件聚合(推荐)

通过CASE WHEN在分组时分别计算每个用户的数学、英语平均分,再做比较:

SELECT name
FROM xyz_table
WHERE subject IN ('Maths', 'English') -- 仅筛选目标科目,提升查询效率
GROUP BY name
HAVING AVG(CASE WHEN subject = 'Maths' THEN marks END) > AVG(CASE WHEN subject = 'English' THEN marks END)

逻辑说明:

  • CASE WHEN会只保留对应科目的分数,其他科目返回NULL,AVG函数会自动忽略NULL值,这样就能得到每个用户单独的数学、英语平均分
  • 最终筛选出数学平均分高于英语平均分的用户

正确解法二:子查询关联

先通过子查询计算每个用户各科目平均分,再关联筛选:

WITH user_subject_avg AS (
    SELECT 
        name,
        subject,
        AVG(marks) AS avg_marks
    FROM xyz_table
    WHERE subject IN ('Maths', 'English')
    GROUP BY name, subject
)
SELECT m.name
FROM user_subject_avg m
JOIN user_subject_avg e 
  ON m.name = e.name
WHERE m.subject = 'Maths' 
  AND e.subject = 'English'
  AND m.avg_marks > e.avg_marks

验证结果

根据你的数据表,最终结果只会返回A(A的数学平均分10,英语平均分6,符合条件;B的两门平均分都是8,不符合;C无目标科目,不纳入)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 17:52:34