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

Я использую этот запрос для получения следующих данных из разных связанных таблиц. Но скажем, VENDORS для предмета было три. Теперь вот в результате я хочу показать Продавцу, который произошел больше всего. Я имею в виду, если Товар ABC поставлялся 3 разными поставщиками много раз. Тогда я хочу получить Продавца, который большую часть времени поставлял товар ABC.

Мой запрос такой.

use iBusinessFlex;
SELECT Items.Name, 
Max(Items.ItemID) as ItemID ,
MAX(Items.Description)as Description,
MAX(ItemsStock.CurrentPrice) as UnitPrice,
MAX(ItemsStock.Quantity) as StockQuantiity,
MAX(Vendors.VendorName) as VendorName, 
SUM(ItemReceived.Quantity) as TotalQuantity
From ItemReceived  
INNER JOIN Items ON ItemReceived.ItemId=Items.ItemID 
INNER JOIN ItemsStock ON ItemReceived.ItemId=ItemsStock.ItemID 
INNER JOIN PurchaseInvoices ON PurchaseInvoices.PurchaseInvoiceId = ItemReceived.PurchaseInvoiceId 
INNER JOIN Vendors ON Vendors.VendorId = PurchaseInvoices.VendorId
Group By Items.Name  

РЕДАКТИРОВАТЬ: Я включил этот подзапрос, но я не уверен, что он показывает правильный результат. я имею в виду Показ продавца для каждого предмета, который предоставил этот товар в большинстве случаев

use iBusinessFlex;
SELECT Items.Name,
Max(Items.ItemID) as ItemID ,
MAX(Items.Description)as Description,MAX(ItemsStock.CurrentPrice) as UnitPrice,
MAX(ItemsStock.Quantity) as StockQuantiity,MAX(Vendors.VendorName) as VendorName, 
SUM(ItemReceived.Quantity) as TotalQuantity
From ItemReceived  
INNER JOIN Items ON ItemReceived.ItemId=Items.ItemID INNER JOIN ItemsStock 
ON ItemReceived.ItemId=ItemsStock.ItemID INNER JOIN PurchaseInvoices 
ON PurchaseInvoices.PurchaseInvoiceId = ItemReceived.PurchaseInvoiceId INNER JOIN Vendors
ON Vendors.VendorId IN (
SELECT Top 1 MAX(PurchaseInvoices.VendorId) as VendorOccur
FROM PurchaseInvoices INNER JOIN Vendors ON Vendors.VendorId=PurchaseInvoices.VendorId
GROUP BY PurchaseInvoices.VendorId
ORDER BY COUNT(*) DESC

И результат выглядит следующим образом.
Result of this query Image

VendorsTable

1 Ответ

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

Во-первых, я бы начал с того, кто заказал какую вещь больше всего. Но МОСТ основан на том, что ... больше всего? Цена ?, Количество раз? Если вы используете одного поставщика и заказываете 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

Нет смысла объединять ВНУТРЕННИЙ подзапрос с продавцом и предметами только по именам. Получите их один раз и только в конце, когда выбран лучший поставщик.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...