#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.