显示以SQL出售的最小单位的产品

时间:2019-12-02 23:00:40

标签: sql ms-access ms-access-2010 ms-access-2016

我受命使用以下查询进行设计:

  

“在2019年售出的产品中(即至少售出一个产品),我们想知道售出最少产品的产品。您的表格必须显示:

  • 产品ID
  • 产品名称
  • 产品的类别名称“

我包括了数据库的屏幕截图。

事实上,我能够检索与所售最小单位相对应的值(在这种情况下为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'作为聚合函数的一部分

SQL DataBase

1 个答案:

答案 0 :(得分:1)

为什么不只使用ORDER BYTOP 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年前

  • 表别名使查询更易于读写。同样,在多表查询中,您希望限定所有列名(查询中缺少一些表前缀)。