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
相关产品推荐
相关产品推荐

