Запрос: выбрать самый дорогой товар, купленный одним покупателем

уважаемые разработчики! Прошу помочь с запросом: Есть таблицы покупатели Customer,Заказы Orders, Товары Items. Схема данных ниже. Требуется найти самый дорогой товар, купленный одним покупателем. То есть если покупателей, который купили этот товар несколько, то этот товар не выводится, если даже он самый дорогой. Мой код не работает,но не могу понять в чем проблема:

 (Select Customer_id,item_id,Customer_name,MAX(item_price) MostExpensiveItemName
from Customer c join Orders o on c.Customer_id = o.Customer_id
join items i on i.item_id = o.item_id) q
inner join (select Customer_id,item_name,item_price from i right join o on i.item_id = o.item_id
            having count(Customer_id) = 1) s on s.item_id =q.item_id 

Схема данных


Ответы (1 шт):

Автор решения: Aziz Umarov

Давайте разбирать по шагам

  1. Товары у которых у которых только один покупатель.

    select  
      item_id 
    from orders 
    group by 
      item_id 
    having 
      count(customer_id) = 1
    
  2. Найдем заказы у которых товары только с одним покупателем.

    select 
        orders.* 
    from orders 
        inner join (
         select  
            item_id 
         from orders 
         group by 
            item_id 
         having 
            count(customer_id) = 1
       ) as uniqOrders 
       on uniqOrders.item_id = orders.item_id
    
  3. Добавим собственно товары и покупателей.

    select 
        customers.*,
        orders.*,
        items.item_prise 
    from customers
        inner join orders
          on orders.customer_id = customers.customer_id
        inner join items
          on items.item_id = orders.item_id 
        inner join (
         select  
            item_id 
         from orders 
         group by 
            item_id 
         having 
            count(customer_id) = 1
       ) as uniqOrders 
       on uniqOrders.item_id = orders.item_id
    
  4. Поскольку мы получили в итоге что у разыскиваемого товара может быть только один покупатель. Нам нужно отсортировать по цене по убыванию и взять только самую первую запись из результирующего набора. Никаких max и прочих вам не нужно.

PS. Если вам необходимо считать максимум по какой-то другой формуле (orders.quatity*items.items_prise) то просто сотртируете по ней.

→ Ссылка