SQL Server:如何选择客户使用的最昂贵项目的总金额 - Northwind DB

时间:2015-02-11 20:30:51

标签: sql sql-server join aggregate-functions

实际问题告诉所有人;很多客户订购了许多商品;我试图通过该客户给出的所有订单显示该客户订购的最昂贵商品的总花费。我正在使用Northwind数据库和表,如客户,订单,订单详细信息,产品。我在下面的查询,我试图通过聚合函数限制它,但SQL不允许它在where子句上。有什么帮助吗?

select 
    p.ProductName,
    c.ContactName,
    od.ProductID,
    MAX(od.UnitPrice)
    SUM(od.UnitPrice*od.Quantity) as Total
from 
    Customers c
join 
    Orders o ON c.CustomerID = o.CustomerID
join 
    [Order Details] od on od.OrderID = o.OrderID
join 
    Products p on od.ProductID = p.ProductID
where 
    c.CustomerID in 
group by 
    c.ContactName, p.ProductName, od.Quantity, od.ProductID
order by 
    MAX(od.UnitPrice) desc

1 个答案:

答案 0 :(得分:0)

我认为解决这个问题的最简单方法是使用窗口函数来获得价格最高的产品。以下查询使用row_number()来实现此目的:

select p.ProductName, c.ContactName, od.ProductID,
       MAX(od.UnitPrice)
       SUM(od.UnitPrice*od.Quantity) as Total
from Customers c join 
     (select od.*, o.CustomerId,
             row_number() over (partition by o.CustomerId
                                order by od.UnitPrice desc) as seqnum
      from [Order Details] od join
           Orders o
           on od.OrderId = o.OrderId
     ) od
     on od.CustomerId = c.CustomerId and seqnum = 1 join 
     Products p
     on od.ProductID = p.ProductID
group by c.ContactName, p.ProductName, od.ProductID
order by MAX(od.UnitPrice) desc;

请注意,join已经重新排列了一下。您需要客户ID在子查询中定义价格最高的产品,因此子查询具有到orders的连接。您不需要外部查询中的连接。