Вам нужен вложенный запрос, но вам не нужно дважды обращаться к таблицам, если вы используете аналитические функции .
select customerID, sumOrderCost from
(
select customerID, sumOrderCost,
rank() over (order by sumOrderCost desc) as rn
from (
select c.customerID, sum(o.orderCost) as sumOrderCost
from customer c, orders o
where c.customerID=o.customerID
group by c.customerID
)
)
where rn = 1;
Функция rank()
ранжирует результаты вашего исходного запроса по значению sum()
, затем вы выбираете только те, которые имеют наивысший ранг, то есть строки с наибольшей общей стоимостью заказа.
Если более одного клиента имеют одинаковую общую стоимость заказа, это вернет оба. Если это не то, что вам нужно, вам придется решить, как определить, какой из результатов использовать. Например, если вам нужен самый низкий идентификатор клиента, добавьте его в функцию ранжирования:
select customerID, sumOrderCost,
rank() over (order by sumOrderCost desc, customerID) as rn
Вы можете настроить исходный запрос так, чтобы вместо него возвращались другие данные, только для упорядочения, и не включать их во внешний select
.