Примерно так:
Select
Items.Name,
Items.Description,
ItemsStock.Quantity,
ItemsStock.CurrentPrice,
Vendors.VendorName
From
ItemsSold
INNER Join Items On ItemsSold.ItemSoldID = Items.ItemID
INNER JOIN ItemsStock On ItemsSold.ItemSoldID = ItemsStock.ItemID
INNER JOIN
(
SELECT *, ROW_NUMBER() OVER(PARTITION BY a.ItemID ORDER BY sumProvided DESC) rown FROM
(
SELECT PI.VendorID, IR.ItemID, SUM(IR.Quantity) as sumProvided
FROM ItemReceived IR
INNER JOIN PurchaseInvoices PI on IR.PurchaseInvoiceID = PI.PurchaseInvoiceID
GROUP BY PI.VendorID, IR.ItemID
) a
) v
ON v.ItemID = Items.ItemID AND v.rown = 1
INNER JOIN Vendors ON Vendors.VendorID = v.VendorID
Здесь есть внутренний запрос, который суммирует поставки определенного товара каждым поставщиком, а затем внешний запрос, который нумерует строки с 1 = самый высокий поставщик
В самом внешнем запросе мы обрезали его до строк, которые были равны rown = 1 (самый продаваемый поставщик
Я удалил внешнюю группу, потому что не могу понять, как имеет смысл объединять этивещи. Вы должны заметить, что для вашего вопроса сложно написать тест, потому что вы не включили пример данных и ожидаемый результат ... но это общая тактика для "найти самый высокий X и вернуть другой столбец Y из той же строки"
Вам придется заменить SUM(PI.PURCHASE_QUANTITY)
чем-то значимым для себя - вы не дали никаких подсказок относительно структуры таблицы PI
Я предполагаю, что, исходя из v.VendorID to Vender.VendorName будет достаточно легким для вас:
OK, поэтому - отладка SQL 101
Я утверждаю, что это должно работать:
Select
*
From
--ItemsSold
--INNER Join Items On ItemsSold.ItemSoldID = Items.ItemID
--INNER JOIN ItemsStock On ItemsSold.ItemSoldID = ItemsStock.ItemID
--INNER JOIN
(
SELECT *, ROW_NUMBER() OVER(PARTITION BY a.ItemID ORDER BY sumProvided DESC) rown FROM
(
SELECT PI.VendorID, IR.ItemID, SUM(IR.Quantity) as sumProvided
FROM ItemReceived IR
INNER JOIN PurchaseInvoices PI on IR.PurchaseInvoiceID = PI.PurchaseInvoiceID
GROUP BY PI.VendorID, IR.ItemID
) a
) v
--ON v.ItemID = Items.ItemID AND v.rown = 1
Я просто поставил SELECT *, а затем убрал все таблицы, кроме одной - той, которая выполняет большую часть работы.Итак ... Возвращает ли он какие-либо записи?
Если нет, то соединение является неисправным (в PI нет записей, относящихся к IR), или в PI действительно нет записей.или IR
Исправьте это так, что это возвращает строки
Следующий вопрос Возвращает ли запрос 1 в столбце rown для поставщиков, которые доставили вам большую часть определенного элемента?
Если нет, то с записями что-то шокирующее - посмотрите.Если это так, у нас все хорошо
Присоединяйтесь к другим таблицам обратно по одному:
Select
*
From
--ItemsSold
/*INNER Join*/ Items /*On ItemsSold.ItemSoldID = Items.ItemID*/
--INNER JOIN ItemsStock On ItemsSold.ItemSoldID = ItemsStock.ItemID
INNER JOIN
(
SELECT *, ROW_NUMBER() OVER(PARTITION BY a.ItemID ORDER BY sumProvided DESC) rown FROM
(
SELECT PI.VendorID, IR.ItemID, SUM(IR.Quantity) as sumProvided
FROM ItemReceived IR
INNER JOIN PurchaseInvoices PI on IR.PurchaseInvoiceID = PI.PurchaseInvoiceID
GROUP BY PI.VendorID, IR.ItemID
) a
) v
ON v.ItemID = Items.ItemID AND v.rown = 1
Продолжайте, пока вдруг не потеряете записи, которые, как вы и не ожидали, исчезнут...
:
Select
*
From
ItemsSold
INNER Join Items On ItemsSold.ItemSoldID = Items.ItemID
--INNER JOIN ItemsStock On ItemsSold.ItemSoldID = ItemsStock.ItemID
INNER JOIN
(
SELECT *, ROW_NUMBER() OVER(PARTITION BY a.ItemID ORDER BY sumProvided DESC) rown FROM
(
SELECT PI.VendorID, IR.ItemID, SUM(IR.Quantity) as sumProvided
FROM ItemReceived IR
INNER JOIN PurchaseInvoices PI on IR.PurchaseInvoiceID = PI.PurchaseInvoiceID
GROUP BY PI.VendorID, IR.ItemID
) a
) v
ON v.ItemID = Items.ItemID AND v.rown = 1
Возможно, все предметы в "проданных предметах" и все предметы в "полученных предметах" не совпадают!(Возможно, вы когда-либо продавали вещи, которые вы не заменили, или продавали вещи, у которых нет записей о покупках для / существующего инвентаря, который находится в Предметах, которые получены, но никогда не продавались, или продавались, но никогда не получали)