SQL - 聚合函数中的子查询

Tho*_*as 11 sql subquery aggregate-functions northwind sql-server-2012

我正在使用northwind数据库通过创建一些或多或少复杂的查询来刷新我的SQL技能.不幸的是,我无法找到我最后一个用例的解决方案:"获取1997年每个类别的五个最大订单的总和."

涉及的表格是:

Orders(OrderId, OrderDate)
Order Details(OrderId, ProductId, Quantity, UnitPrice)
Products(ProductId, CategoryId)
Categories(CategoryId, CategoryName)
Run Code Online (Sandbox Code Playgroud)

我尝试了以下查询

SELECT c.CategoryName, SUM(
  (SELECT TOP 5 od2.UnitPrice*od2.Quantity 
   FROM [Order Details] od2, Products p2
   WHERE od2.ProductID = p2.ProductID
   AND c.CategoryID = p2.CategoryID
   ORDER BY 1 DESC))
FROM [Order Details] od, Products p, Categories c, Orders o 
WHERE od.ProductID = p. ProductID
AND p.CategoryID = c.CategoryID
AND od.OrderID = o.OrderID
AND YEAR(o.OrderDate) = 1997
GROUP BY c.CategoryName
Run Code Online (Sandbox Code Playgroud)

嗯......事实证明,在聚合函数中不允许使用子查询.我已经阅读了有关此问题的其他帖子,但无法找到针对我的具体用例的解决方案.希望你能帮帮我...

Gor*_*off 25

通常在聚合函数中不允许子查询.相反,移动骨料的子查询.在这种情况下,您将需要一个额外级别的子查询,因为top 5:

SELECT c.CategoryName,
  (select sum(val)
   from (SELECT TOP 5 od2.UnitPrice*od2.Quantity as val
         FROM [Order Details] od2, Products p2
         WHERE od2.ProductID = p2.ProductID
         AND c.CategoryID = p2.CategoryID
         ORDER BY 1 DESC
        ) t
  )
FROM [Order Details] od, Products p, Categories c, Orders o 
WHERE od.ProductID = p. ProductID
AND p.CategoryID = c.CategoryID
AND od.OrderID = o.OrderID
AND YEAR(o.OrderDate) = 1997
GROUP BY c.CategoryName, c.CategoryId
Run Code Online (Sandbox Code Playgroud)