实际问题告诉所有人;很多客户订购了许多商品;我试图通过该客户给出的所有订单显示该客户订购的最昂贵商品的总花费。我正在使用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
答案 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
的连接。您不需要外部查询中的连接。