SSMS 2014环境下按各订单总订单项价值查询前300条数据的方法
你移除GROUP BY子句触发报错的核心原因是:SELECT列表中同时存在非聚合字段(orderid、traderid等)和SUM()聚合函数,如果没有GROUP BY指定分组维度,数据库无法判断非聚合字段的取值规则,因此抛出字段不在聚合函数或GROUP BY中的错误。
原代码问题分析
- GROUP BY子句错误加入了
orderitems.nettprice,导致分组颗粒度为单个订单项,SUM(nettprice)计算结果等价于单个订单项的价格,没有实现按订单汇总总净价的需求 - ORDER BY子句使用了未聚合的
orderitems.nettprice,排序逻辑为单个订单项价格降序,不符合按订单总价值排序的要求
修复后代码
场景1:查询总净价最高的前300个订单的汇总信息
SELECT TOP 300 orderitems.orderid, orders.traderid, orders.orderdate, SUM(orderitems.nettprice) AS total_nettprice FROM orderitems INNER JOIN orders ON orders.tradertype = 'S' AND orders.id = orderitems.orderid WHERE orderitems.ordertype = 'PO' GROUP BY orderitems.orderid, orders.traderid, orders.orderdate ORDER BY total_nettprice DESC
场景2:查询总净价最高的前300个订单对应的所有商品明细条目
WITH order_total AS ( -- 先计算每个订单的总净价 SELECT orderid, SUM(nettprice) AS total_nettprice FROM orderitems WHERE ordertype = 'PO' GROUP BY orderid ), top_orders AS ( -- 取总净价最高的前300个订单 SELECT TOP 300 orderid FROM order_total ORDER BY total_nettprice DESC ) -- 查询这些订单下的所有商品明细 SELECT oi.orderid, o.traderid, o.orderdate, oi.nettprice AS item_nettprice, ot.total_nettprice FROM orderitems oi INNER JOIN orders o ON o.tradertype = 'S' AND o.id = oi.orderid INNER JOIN top_orders tor ON tor.orderid = oi.orderid INNER JOIN order_total ot ON ot.orderid = oi.orderid ORDER BY ot.total_nettprice DESC, oi.orderid
内容的提问来源于stack exchange,提问作者TheOx
相关产品推荐
相关产品推荐

