我正在尝试对SUM(OrderDetails.Quantity(进行分组,但一直收到错误不在聚合函数或逐子句分组中: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
我试图创建一个表格,显示客户和他们订购的产品数量,同时还显示他们的CompanyName和ContactName。
写这个:
GROUP BY OrderDetails.CustomerID, Customers.CompanyName, Customers.ContactName
与MySQL、PostgreSQL和标准SQL不同,在大多数其他SQL方言中,如果您还想在SELECT
子句或其他地方投影函数依赖列,则仅通过主键进行分组是不够的。您必须显式地GROUP BY
所有要投影的列。
不要从订单表中获取客户id。把它从顾客桌上拿下来。如果你这样做,这个可能在你的数据库中工作:
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.CustomerId
在OrderDetails
中不是唯一的。许多数据库不支持这一点,因此在这些数据库中需要额外的列:
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;
即便如此,从同一个表中提取所有列要好得多。这将允许SQL优化器在Customers
上使用索引。