Получение наиболее распространенного названия товара и его наивысшей цены из нескольких категорий одним SQL-запросом

#sql #sql-server #tsql

#sql #sql-сервер #tsql

Вопрос:

У меня есть таблица шаблонов, которая содержит несколько идентификаторов типов для каждого templateId. У меня есть таблица Items с ItemName, ItemPrice и TypeID. Мне нужно получить наиболее распространенное имя элемента и самую высокую цену в этом ItemName каждого TypeID, который прикреплен к выбранному шаблону. Мой запрос не работает, поскольку, очевидно, он возвращает несколько строк из ItemsTable для каждого TypeID из-за внутреннего joi, но я не могу найти способ написать запрос. Мой запрос :

 select t.TypeID, t.TemplateID, n.ItemName, n.MaxPrice
from Templates t 
inner join (select count(i.ItemName) as foundn, i.ItemName, max(i.ItemPrice) as MaxPrice, i.TypeID
        from Items i
        group by i.TypeID, i.ItemName) n on n.TypeID=t.TypeID
WHERE t.TemplateID=2;
  

Результат, который я хотел бы видеть, выглядит так:

templateId 1:

  • TypeID 1 — общее имя элемента, их самая высокая цена
  • TypeID 2 — общее имя элемента, их самая высокая цена

…etc

Комментарии:

1. Примеры данных и ожидаемый результат были бы очень полезны.

2. Пожалуйста, прочтите это , чтобы получить несколько советов по улучшению вашего вопроса.

3. Извините, я понятия не имел, что также могу импортировать Excel. В следующий раз я поступлю правильно. Однако на вопрос был дан ответ, и это именно то решение, которое я искал.

Ответ №1:

Попробуйте это:

 WITH DataSource AS
(
    select t.TypeID, t.TemplateID, n.ItemName, n.MaxPrice, ROW_NUMBER() OVER (PARTITION BY t.TemplateID, t.TypeID ORDER BY foundn DESC) as rn
    from Templates t 
    inner join 
    (
        select count(i.ItemName) as foundn, i.ItemName, max(i.ItemPrice) as MaxPrice, i.TypeID
        from Items i
        group by i.TypeID, i.ItemName
    ) n 
        on n.TypeID=t.TypeID
    WHERE t.TemplateID=2
)
SELECT *
FROM DataSource
WHERE rn = 1
  

Идея состоит в том, чтобы использовать ROW_NUMBER для генерации идентификатора строки для каждой пары шаблонов, начиная с самой большой foundn . Затем отобразите только их с идентификатором строки = 1.