Для каждой страны найдите категорию продукта, которая была самой популярной - подзапросы - PullRequest
0 голосов
/ 26 марта 2019

Таблицы даны:

1) Categories: id, name
2) Countries: id, name
3) Producers: id, name, country_id
4) Products: id, name, price, category_id, producer_id
5) Customers: id, name, surname, age, country_id
6) Customer_orders: id, customer_id, product_id, quantity, discount, order_date

Я хочу найти категорию наиболее популярных товаров для каждой страны (категория самых популярных товаров - товары были произведены производителями из указанной страны)

Мое нынешнее приложение:

select countries.name, categories.name, sum(cs.quantity) from countries
join producers on producers.country_id = countries.id
join products on products.producer_id = producers.id
join categories on categories.id = products.category_id
join customerorders as cs on cs.product_id = products.id
group by countries.name

Это не совсем хорошее решение. Не уверен, как это сделать, я полагаю, мне следует сгруппировать все продукты по странам, а затем для каждой страны подсчитать количество продуктов для каждой категории продуктов (продукты, произведенные производителями из указанной страны) и, наконец, найти категорию с большинством приобретенных продуктов.

1 Ответ

2 голосов
/ 26 марта 2019

Вам нужно исправить group by и затем использовать функции окна:

select c.*
from (select co.name as country_name, c.name as category_name, sum(co.quantity) as total_qty,
             row_number() over (partition by co.name order by sum(co.quantity) desc) as seqnum
      from countries co join
           producers pr
           on pr.country_id = co.id join
           products p
           on p.producer_id = pr.id join
           categories c
           on c.id = p.category_id join
           customerorders co
           on co.product_id = p.id
      group by co.name, c.name
     ) c
where seqnum = 1;

Это должно работать в MySQL 8+. Это можно выразить в более ранних версиях, но это немного болезненно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...