多表关联分组计算订单总金额的SQL查询报错求助
问题描述
需要从tblOrder和tblOrderDetails两张表中查询以下格式的数据:
| Order No | Total | OrderDate |
|---|---|---|
| ORD 1 | 3000 | 01/01/2021 |
| ORD 2 | 2750 | 01/03/2021 |
其中Total为每单所有明细行的Quantity*UnitCost之和。
执行以下SQL时触发报错:quantity is not a part of aggregate function
SELECT tblOrder.OrderNo, tblOrderDetails.UnitCost*tblOrderDetails.Quantity AS Total, OrderDate FROM tblOrderDetails INNER JOIN tblOrder ON tblOrderDetails.OrderId = tblOrder .OrderId GROUP BY tblOrder.OrderNo;
表结构及数据
tblOrder表
| OrderId | OrderNo | OrderDate |
|---|---|---|
| 1 | ORD 1 | 01/01/2021 |
| 2 | ORD 2 | 01/03/2021 |
tblOrderDetails表
| OrderDetailId | Quantity | UnitCost | OrderId |
|---|---|---|---|
| 1 | 100 | 30 | 1 |
| 2 | 50 | 40 | 2 |
| 3 | 10 | 15 | 2 |
| 4 | 20 | 30 | 2 |
解决方案
报错核心原因:使用GROUP BY分组时,SELECT子句中的列要么属于GROUP BY指定的分组字段,要么被聚合函数(如SUM、COUNT)包裹。原SQL中tblOrderDetails.UnitCost*tblOrderDetails.Quantity是单条明细的金额,属于未聚合的非分组字段,数据库无法将多行明细值合并为单组分组结果,因此触发错误。
修正后的SQL语句:
SELECT tblOrder.OrderNo, SUM(tblOrderDetails.UnitCost * tblOrderDetails.Quantity) AS Total, tblOrder.OrderDate FROM tblOrderDetails INNER JOIN tblOrder ON tblOrderDetails.OrderId = tblOrder.OrderId GROUP BY tblOrder.OrderNo, tblOrder.OrderDate;
关键说明
SUM(tblOrderDetails.UnitCost * tblOrderDetails.Quantity):通过聚合函数SUM计算每个订单下所有明细行的金额总和,得到每单总金额。GROUP BY tblOrder.OrderNo, tblOrder.OrderDate:显式指定所有非聚合字段作为分组依据,确保每个分组对应唯一订单(每个订单编号对应唯一订单日期),符合SQL标准分组规则,适配绝大多数数据库。
内容的提问来源于stack exchange,提问作者Alexander Raymak
相关产品推荐
相关产品推荐

