我受命使用以下查询进行设计:
“在2019年售出的产品中(即至少售出一个产品),我们想知道售出最少产品的产品。您的表格必须显示:
我包括了数据库的屏幕截图。
事实上,我能够检索与所售最小单位相对应的值(在这种情况下为95),但也无法在MS Access中显示与该值相对应的产品名称。
使用以下代码显示正确的最小值:
SELECT MIN(UnitsSold)
FROM
(SELECT Products.ProductID, ProductName, Categories.CategoryID, CategoryName, SUM(Quantity) AS UnitsSold
FROM Orders, OrderDetails, Products, Categories
WHERE Orders.OrderID = OrderDetails.OrderID AND OrderDetails.ProductID = Products.ProductID And Products.CategoryID = Categories.CategoryID AND OrderDate BETWEEN #01/01/2019# AND #12/31/2019#
GROUP BY Products.ProductID, ProductName, Categories.CategoryID, CategoryName
HAVING SUM(Quantity) >= 1);
但是当我尝试同时显示具有此修改的产品时:
SELECT MIN(UnitsSold, Products.ProductID, ProductName
FROM
(SELECT Products.ProductID, ProductName, Categories.CategoryID, CategoryName, SUM(Quantity) AS UnitsSold
FROM Orders, OrderDetails, Products, Categories
WHERE Orders.OrderID = OrderDetails.OrderID AND OrderDetails.ProductID = Products.ProductID And Products.CategoryID = Categories.CategoryID AND OrderDate BETWEEN #01/01/2019# AND #12/31/2019#
GROUP BY Products.ProductID, ProductName, Categories.CategoryID, CategoryName
HAVING SUM(Quantity) >= 1);
我遇到错误:
您的查询未将指定的表达式'ProductID'作为聚合函数的一部分
答案 0 :(得分:1)
为什么不只使用ORDER BY
和TOP 1
?
SELECT TOP (1)
p.ProductID,
ProductName,
c.CategoryName,
FROM
Orders o
INNER JOIN OrderDetails od ON o.OrderID = od.OrderID
INNER JOIN Products p ON od.ProductID = p.ProductID
INNER JOIN Categories c ON p.CategoryID = c.CategoryID
WHERE OrderDate BETWEEN #01/01/2019# AND #12/31/2019#
GROUP BY
p.ProductID,
ProductName,
c.CategoryName
HAVING SUM(Quantity) >= 1
ORDER BY SUM(Quantity) DESC
注意:
始终使用显式联接(带有ON
关键字)而不是隐式联接(FROM
子句中带有逗号),隐式联接的语法较难遵循,并且越来越不受欢迎比20年前
表别名使查询更易于读写。同样,在多表查询中,您希望限定所有列名(查询中缺少一些表前缀)。