Выберите максимальное значение с помощью subQuery SQL - PullRequest
0 голосов
/ 23 апреля 2019

Используя приведенный ниже запрос, я выбираю ItemName, Description из Items Table и QuantityInStock, CurrentPrice из ItemsStock Table. А также пытается извлечь VendorName для каждого элемента из Vendors таблицы, используя PurchaseInvoices и ItemsReceived Table Relation. Теперь проблема в том, что я хочу получить продавца, который предоставил САМОЕ КОЛИЧЕСТВО для конкретного элемента.

Я имею в виду, скажем, ITEM ABC было предоставлено 3 ВЕНДЕРАМИ V1, V2 и V3 и V3 предоставлено 90 раз (Он предоставил наибольшее количество). Теперь я хочу показать его в столбце VendorName. Например, для каждого предмета покажите поставщика, который предоставил этот предмет чаще всего.

Я использую запрос (я думаю, этот подзапрос необходимо изменить)

Select Items.Name,Max(Items.Description) as Description ,
Max(ItemsStock.Quantity) as QuantityInStock,Max(ItemsStock.CurrentPrice)as CurrentPrice,Max(Vendors.VendorName)
From ItemsSold
INNER Join Items On ItemsSold.ItemSoldID = Items.ItemID
INNER JOIN ItemsStock On ItemsSold.ItemSoldID = ItemsStock.ItemID
INNER JOIN Vendors ON Vendors.VendorID = (

select max(PI.VendorID)
from ItemReceived IR
JOIN PurchaseInvoices PI on IR.PurchaseInvoiceID = PI.PurchaseInvoiceID
Where IR.ItemID=Items.ItemID
group by IR.ItemID
)
Group By Items.Name

Ответы [ 2 ]

2 голосов
/ 23 апреля 2019

Примерно так:

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

Возможно, все предметы в "проданных предметах" и все предметы в "полученных предметах" не совпадают!(Возможно, вы когда-либо продавали вещи, которые вы не заменили, или продавали вещи, у которых нет записей о покупках для / существующего инвентаря, который находится в Предметах, которые получены, но никогда не продавались, или продавались, но никогда не получали)

1 голос
/ 23 апреля 2019

Вы можете просто присоединиться к подзапросу

 Select Items.Name,Max(Items.Description) as Description ,
Max(ItemsStock.Quantity) as QuantityInStock,Max(ItemsStock.CurrentPrice)as CurrentPrice,V.VendorName
From ItemsSold
INNER Join Items On ItemsSold.ItemSoldID = Items.ItemID
INNER JOIN ItemsStock On ItemsSold.ItemSoldID = ItemsStock.ItemID
INNER JOIN  (
select max(PI.VendorID) VendorID,IR.ItemID
from ItemReceived IR
JOIN PurchaseInvoices PI on IR.PurchaseInvoiceID = PI.PurchaseInvoiceID
group by IR.ItemID
) Vendors ON Vendors.ItemID=Items.ItemID 
join Vendors v on v.VendorID=Vendors.VendorID
Group By Items.Name,V.VendorName
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...