选择内部联接的最多发生值SQL

问题描述 投票:0回答:1

我正在使用此查询从不同的链接表中获取以下数据。但是,让我们说一个项目的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

结果看起来像这样。

sql sql-server
1个回答
1
投票

首先,我会从谁订购最多的东西开始。但MOST的基础是......数量最多?价格?,次数?如果您使用一个供应商并订购6次数量为10的数量,则您有60件事。但是从另一个供应商那里订购1次,价格为100,其中一个赢了。你必须决定MOST的基础,但我会根据你原来的问题基于大多数时间。

因此,所有东西都来自具有供应商ID的PurchasedInvoices。我不关心供应商是谁,只是他们的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,这将创建一个相关的子查询,你可以添加'TOP 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

让INNER子查询加入供应商和仅为名称的项目是没有意义的。获得那些曾经且仅在最终供应商被选中时的结果。

© www.soinside.com 2019 - 2024. All rights reserved.