Получение самого продаваемого продукта на поставщика в sql

Ну, я борюсь с этим вопросом в SQL, используя MySql:

Я должен указать продукт, который в основном был продан на одного поставщика из популярной базы данных с открытым исходным кодом под названием NORTHWIND: https://northwinddatabase.codeplex.com

Теперь то, что я написал:

SELECT  products.SupplierID ,`order details`.ProductID, count(*) as NumSales FROM `order details` 
    JOIN products ON `order details`.ProductID = products.ProductID
    JOIN orders ON `order details`.OrderID = orders.OrderID
    WHERE `order details`.OrderID 
        IN
        (SELECT OrderID FROM orders 
           WHERE MONTH(OrderDate) = 7 AND YEAR(orderDate) = 1997) 


    group by products.SupplierID  , `order details`.ProductID 
    ORDER BY NumSales desc
    ;

Результат:

результат

что все это хорошо, но мне нужно вернуть, например, для Поставщика 1 Продукт 1, так как он был продан 3 раза (7/1997)

Дополнение к началу:

SELECT SupplierID, ProductID, MAX(b.NumSales)
FROM( ... )

сближает меня, но дает мне лучший из всех поставщиков, а не для каждого поставщика.

Помощь будет велика.

P.S. Этот вопрос похож, но тот же и полностью мне не помог.


person Tomer    schedule 26.03.2018    source источник
comment
У меня такое чувство, что это домашнее задание, поэтому просто дать ответ бесполезно. Я бы использовал вариант stackoverflow.com/questions/19432913/ как мой подход... используйте запрос, который у вас есть сейчас, чтобы выбрать максимальное количество и соединить его обратно с вашими данными, чтобы получить остальные колонн. Вам нужно будет определить, какую логику использовать, когда есть несколько продуктов, которые продали максимум (если у поставщика с идентификатором 1 есть и идентификатор продукта 1, и идентификатор 2, продающий 3, что вы возвращаете?)   -  person Twelfth    schedule 26.03.2018
comment
Да, это домашняя работа, но мне не стыдно спросить, не просит ли это просто ответа, а пути, а также я проделал (я думаю) большую часть пути. Спасибо, посмотрю, надеюсь поможет!   -  person Tomer    schedule 26.03.2018
comment
@Twelfth используйте запрос, который у вас есть сейчас, чтобы выбрать максимальное количество и соединить его обратно с вашими данными, чтобы получить остальные столбцы - что вы имеете в виду, присоединив его обратно?   -  person Tomer    schedule 26.03.2018
comment
@Icemanind Да, вы правы ... По ошибке я оставил прежнее название вопроса, который чуть не задал ... Спасибо, что заметили и уведомили меня.   -  person Tomer    schedule 26.03.2018
comment
@Tomer - любой запрос может быть подзапросом. **выбрать * из (выбрать * из таблицы) ** является допустимым. select * from (сложный подзапрос) a внутреннее соединение sametablequeriedinsubquery b на a.id = b.id также допустимо.   -  person Twelfth    schedule 26.03.2018
comment
@a_horse_with_no_name ваше право! Я использую MySQL. отредактирую мой вопрос   -  person Tomer    schedule 26.03.2018
comment
Это может быть связано с домашним заданием, но в качестве совета для будущего обучения никогда не включайте пробелы в имена таблиц. Вместо этого используйте символы подчеркивания как order_details.   -  person Twelfth    schedule 26.03.2018
comment
@ Двенадцатая Надеюсь, я не слишком тебя беспокою. Я попытался написать соединение в конце запроса (также перед группой, а также после порядка), теперь просто для того, чтобы рисовать и лучше понимать SQL, но я получаю недействительный ввод в этой позиции, может быть, потому что я использую MySql?   -  person Tomer    schedule 26.03.2018
comment
Да, вы правы, я видел, что это не очень хорошая практика при работе над этим. Кроме того, вы имеете право на то, что я все еще должен делать это, потому что это задание. Спасибо   -  person Tomer    schedule 26.03.2018


Ответы (1)


Пожалуйста, знайте это как псевдоответ и работайте с ним, как хотите ... цените, что вы тратите время на изучение этого.

select supplier_id, max(num_sales) max_sales
from (put your select statement here)
group by supplier_id

Теперь это дает вам максимальное значение num_sales для каждого поставщика. Что-то типа

supplier_id    max_sales
1              3
2              1
3              2
4              2

Теперь соедините это с вашим исходным запросом, чтобы получить данные о продукте для всего, что соответствует макс.

select a.supplier_id, b.product_id, a.max_sales 
from
(select supplier_id, max(num_sales) max_sales
from (put your select statement here)
group by supplier_id) a
inner join 
(your original query again) b
on a.supplier_id = b.supplier_id
and a.max_sales = b.num_sales

Изучая SQL, вы увидите, что обычно существуют сотни действующих сценариев, которые дадут вам нужный ответ... ваша задача — найти сценарий, который быстрее всего пишется, наиболее эффективен в выполнении и соответствует критериям вашей задачи. Преимущество метода, показанного здесь, заключается в том, что он будет отображать несколько записей в случае ничьей (supplier_id = 2 имеет два продукта, максимальные продажи которых у бота равны одному. Этот запрос возвращает обе эти строки).

так же, как дополнительная информация... другие базы данных допускают общие табличные выражения (с предложением), а mysql - нет. Как вы используете предложение WITH в MySQL? в других базах данных вы можете еще больше упростить этот сценарий.

person Twelfth    schedule 26.03.2018
comment
Спасибо большое! На самом деле я нашел решение благодаря вашим комментариям, но я уверен, что в вашем ответе я лучше понимаю SQL, поэтому я прочитаю его завтра и, возможно, отмечу его как ответ. - person Tomer; 26.03.2018
comment
Если вам действительно хочется пройти лишнюю милю... вы можете использовать логику здесь stackoverflow.com/questions/3333665/rank-function-in-mysql, чтобы придумать версию этого скрипта, которая будет возвращать только одну строку для каждого поставщика. - person Twelfth; 26.03.2018