不在聚合函数或 group by 子句中:org.hsqldb.Expression@59bcb2b6 在语句中

Not in aggregate function or group by clause: org.hsqldb.Expression@59bcb2b6 in statement

我正在尝试对 SUM(OrderDetails.Quantity) 进行分组,但一直收到错误 Not in aggregate function or group by clause: org.hsqldb.Expression@59bcb2b6 在声明中 但是因为我已经有一个 GROUP BY 部分我不知道我错过了什么

SQL 声明:

SELECT OrderDetails.CustomerID, Customers.CompanyName, Customers.ContactName, SUM(OrderDetails.Quantity) 
FROM OrderDetails INNER JOIN Customers ON OrderDetails.CustomerID = Customers.CustomerID 
WHERE OrderDetails.CustomerID = Customers.CustomerID 
GROUP BY OrderDetails.CustomerID
ORDER BY OrderDetails.CustomerID ASC

我正在尝试创建一个 table 来显示客户和他们订购的产品数量,同时还显示他们的公司名称和联系人姓名。

这样写:

GROUP BY OrderDetails.CustomerID, Customers.CompanyName, Customers.ContactName

与 MySQL、PostgreSQL 和标准 SQL 不同,在大多数其他 SQL 方言中,仅按主键分组是不够的,如果您还希望在 SELECT 子句或其他地方投影功能相关的列。您必须明确 GROUP BY 所有要投影的列。

不要从订单中获取客户 ID table。从客户那里拿走 table。如果您这样做,可能在您的数据库中工作:

SELECT c.CustomerID, c.CompanyName, c.ContactName, SUM(od.Quantity) 
FROM OrderDetails od INNER JOIN
     Customers c
     ON od.CustomerID = c.CustomerID 
GROUP BY c.CustomerID
ORDER BY c.CustomerID ASC;

注意WHERE子句不需要重复ON子句中的条件。

您的版本无法在标准 SQL 中运行,因为 od.CustomerIdOrderDetails 中不是唯一的。许多数据库不支持这个,所以在这些数据库中你需要额外的列:

SELECT c.CustomerID, c.CompanyName, c.ContactName, SUM(od.Quantity) 
FROM OrderDetails od INNER JOIN
     Customers c
     ON od.CustomerID = c.CustomerID 
GROUP BY c.CustomerID, c.CompanyName, c.ContactName
ORDER BY c.CustomerID ASC;

即便如此,从同一个 table 中获取所有列要好得多。这将允许 SQL 优化器在 Customers.

上使用索引