Попробуйте это,
;WITH orderCTE AS
( SELECT p.ProductName,
o.CustomerID,
SUM(od.Quantity) [Quantity]
FROM Products p
INNER JOIN [Order Details] od
ON od.ProductID = p.ProductID
INNER JOIN Orders o
ON o.OrderID = od.OrderID
GROUP BY p.ProductName, o.CustomerID
)
SELECT ProductName, [TotalQuantity], CustomerID
FROM ( SELECT CustomerID,
ProductName,
Quantity,
MAX(Quantity) OVER(PARTITION BY ProductName) [MaxQuantity],
SUM(Quantity) OVER(PARTITION BY ProductName) [TotalQuantity]
FROM orderCTE
) ord
WHERE MaxQuantity = Quantity
EDIT
Вышеприведенное вернет дубликаты, если несколько клиентов заказывали один и тот же продукт максимальное количество раз. Этого можно избежать, используя приведенный ниже список, который будет возвращать список идентификаторов клиентов, разделенных точкой с запятой, которые заказывали каждый продукт максимальное количество раз:
;WITH orderCTE AS
( SELECT p.ProductName,
o.CustomerID,
SUM(od.Quantity) [Quantity]
FROM Products p
INNER JOIN [Order Details] od
ON od.ProductID = p.ProductID
INNER JOIN Orders o
ON o.OrderID = od.OrderID
GROUP BY p.ProductName, o.CustomerID
), MaxOrdersCTE AS
( SELECT CustomerID,
ProductName,
Quantity,
MAX(Quantity) OVER(PARTITION BY ProductName) [MaxQuantity],
SUM(Quantity) OVER(PARTITION BY ProductName) [TotalQuantity]
FROM orderCTE
)
SELECT ProductName,
[TotalQuantity],
STUFF(( SELECT ';' + CONVERT(VARCHAR, CustomerID)
FROM MaxOrdersCTE c
WHERE ord.ProductName = c.Productname
AND MaxQuantity = Quantity
FOR XML PATH('')
), 1, 1, '') [CustomerIDs]
FROM MaxOrdersCTE ord
WHERE MaxQuantity = Quantity