Access查询问题:用SUM与TOP20获取销量前20的ProductCode
问题解决:Access中按产品汇总销量并取前20
核心错误分析
- GROUP BY误用聚合别名:Access不允许在
GROUP BY子句中使用聚合字段的别名(比如SumOfQTY)——GROUP BY逻辑在聚合计算前执行,此时别名还未生成,这是查询提示输入SumOfQty值的直接原因。 - 关联字段不匹配:你的
Orders表主键是ID,但原查询用Orders.OrderID关联,导致数据无法正确匹配,这也是查询异常的关键因素。 - LEFT JOIN不合理:你需要的是有销售明细的有效订单数据,
LEFT JOIN会保留无明细的空订单(这类记录销量为NULL),改用INNER JOIN更贴合需求。 - Count与Sum的混淆:
Count统计的是记录条数,不是销量总和;只有Sum(QTY)才能计算每个产品的实际总销量,这也是你之前结果错误的原因。
修正后的SQL查询
SELECT TOP 20 SUM(OrderDetails.QTY) AS SumOfQTY, OrderDetails.ProductCode, OrderDetails.Packaging FROM Orders INNER JOIN OrderDetails ON Orders.ID = OrderDetails.OrderID WHERE Orders.ShipDate BETWEEN #8/29/2022# AND #9/1/2022# AND Orders.Rep = "Amazon" GROUP BY OrderDetails.ProductCode, OrderDetails.Packaging ORDER BY SUM(OrderDetails.QTY) DESC;
额外场景说明
如果同一个ProductCode对应多个Packaging值,上述查询会按ProductCode+Packaging分组汇总;若业务要求按ProductCode统一汇总(忽略包装差异),可调整为:
SELECT TOP 20 SUM(OrderDetails.QTY) AS SumOfQTY, OrderDetails.ProductCode, First(OrderDetails.Packaging) AS Packaging FROM Orders INNER JOIN OrderDetails ON Orders.ID = OrderDetails.OrderID WHERE Orders.ShipDate BETWEEN #8/29/2022# AND #9/1/2022# AND Orders.Rep = "Amazon" GROUP BY OrderDetails.ProductCode ORDER BY SUM(OrderDetails.QTY) DESC;
内容的提问来源于stack exchange,提问作者Ira
相关产品推荐
相关产品推荐

