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

SQL多表JOIN结合GROUP BY统计商品销量时SUM计算异常问题求助

SQL问题排查及修复方案

原SQL存在的问题

  • SELECT字段与GROUP BY规则不匹配:SQL语法要求所有未使用聚合函数的字段必须全部放入GROUP BY子句中,你在SELECT中返回了WARRANTY_PERIOD、ORDER_MODE两个非聚合字段,但GROUP BY仅声明了PRODUCT_NAME,会直接触发语法错误,同时你额外查询的这两个字段也不在需求要求的返回字段列表中,属于多余查询。
  • 累计销量筛选条件位置错误:你在WHERE子句中写的oi.QUANTITY>200是筛选单条订单明细的商品数量大于200,不是需求要求的累计总销量大于200,聚合后结果的筛选需要放到HAVING子句中。
  • 不必要的表关联冗余且逻辑矛盾:你关联了ORDERS表但没有用到该表任何字段,属于冗余关联会拖慢查询效率;同时你使用LEFT JOIN关联ORDER_ITEMS,但在WHERE子句中对oi.QUANTITY加了非空判断条件,相当于强制把LEFT JOIN转为了INNER JOIN,逻辑矛盾。
  • 聚合结果未加别名:sum(oi.QUANTITY)未按需求指定别名TOTAL_QUANTITY,不符合返回字段要求。

修复后的SQL

SELECT 
    p.PRODUCT_NAME, 
    SUM(oi.QUANTITY) AS TOTAL_QUANTITY
FROM PRODUCT_INFORMATION p 
INNER JOIN ORDER_ITEMS oi ON p.PRODUCT_ID = oi.PRODUCT_ID
WHERE 
    p.PRODUCT_NAME NOT LIKE '%<%' 
    AND p.PRODUCT_NAME NOT LIKE '%\_%' ESCAPE '\'
GROUP BY p.PRODUCT_NAME
HAVING SUM(oi.QUANTITY) > 200;

修改说明

  • 移除了多余的ORDERS表关联,以及不需要返回的WARRANTY_PERIOD、ORDER_MODE字段,GROUP BY仅保留PRODUCT_NAME符合语法要求。
  • 累计销量大于200的条件放到了HAVING子句中,对聚合后的总销量做筛选。
  • 把LEFT JOIN改为INNER JOIN,因为我们只需要统计有订单记录且累计销量大于200的商品,不需要关联无订单的商品。
  • 给SUM聚合结果加别名TOTAL_QUANTITY,符合返回字段要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 21:39:03