Во-первых, я бы начал с того, кто заказал какую вещь больше всего. Но МОСТ основан на том, что ... больше всего? Цена ?, Количество раз? Если вы используете одного поставщика и заказываете 6 раз из 10, у вас будет 60 вещей. Но заказывайте 1 раз у другого продавца за 100 шт., Который выигрывает. Вы должны решить основание МОСТ, но я буду основываться на большинстве случаев
за ваш оригинальный вопрос.
Таким образом, все происходит из-за PurchaseagedInvoices, у которых есть идентификатор поставщика. Мне все равно, кто продавец, только их ID, поэтому не нужно присоединяться. Кроме того, не нужно имя элемента, если я просто ищу свои счета. В приведенном ниже запросе будет отображаться информация о товаре, о каждом продавце и соответствующем количестве заказов. Я добавил элементы и объединения таблиц поставщиков, чтобы показать имена.
select
IR.ItemID,
PI.VendorID,
max( I.Name ) Name,
max( V.VendorName ) VendorName,
count(*) as TimesOrderedFrom,
SUM( IR.Quantity ) as QuantityFromVendor
from
ItemsReceived IR
JOIN PurchaseInvoices PI
on IR.PurchaseInvoiceID = PI.PurchaseInvoiceID
JOIN Items I
on IR.ItemID = I.ItemID
JOIN Vendors V
on IR.VendorID = V.VendorID
group by
IR.ItemID,
PI.VendorID
order by
-- Per item
IR.ItemID,
-- Most count ordered
count(*),
-- If multiple vendors, same count, get total quantity
sum( IR.Quantity )
Теперь, чтобы получить только 1 за элемент, это создаст коррелированный подзапрос, и вы
Можно добавить «ТОП 1», чтобы вернуть только первый по этому. Поскольку совокупность графа
уже сделано, вы можете получить контактную информацию поставщика.
select
I.Name,
V.VendorName,
TopVendor.TimesOrderedFromVendor,
TopVendor.QuantityFromVendor
from
Items I
JOIN ( select TOP 1
IR.ItemID,
PI.VendorID,
count(*) as TimesOrderedFrom,
SUM( IR.Quantity ) as QuantityFromVendor
from
ItemsReceived IR
JOIN PurchaseInvoices PI
on IR.PurchaseInvoiceID = PI.PurchaseInvoiceID
where
-- correlated subquery based on the outer-most item
IR.ItemID = I.ItemID
group by
IR.ItemID,
PI.VendorID
order by
-- Per item
IR.ItemID,
-- Most count ordered
count(*),
-- If multiple vendors, same count, get total quantity
sum( IR.Quantity ) ) TopVendor
on I.ItemID = TopVendor.ItemID
JOIN Vendors V
on TopVendor.VendorID = V.VendorID
Нет смысла объединять ВНУТРЕННИЙ подзапрос с продавцом и предметами только по именам. Получите их один раз и только в конце, когда выбран лучший поставщик.