选择每个供应商SQL的5个最后订单

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

我必须计算数据库中每个供应商的最后五个订单的平均数量。我只想要清单上有30个订单的供应商,所以我创建了一个CTE并包含row_number语句以选择最后5个订单,但只接受最后5个订单,而不是每个供应商。这是我的代码:

With MyCTE (VendorID, OrderDate, PurchaseOrderID, SubTotal, RowNumber)
as
(Select poh.VendorID, OrderDate, PurchaseOrderID, round(SubTotal,2) as Subtotal, ROW_NUMBER () over (Partition by VendorID Order by OrderDate desc) as 'RowNumber'
From Purchasing.PurchaseOrderHeader as poh 
Inner join Purchasing.Vendor as pv on poh.VendorID = pv.BusinessEntityID
where PreferredVendorStatus = '0' and ActiveFlag = '1' AND poh.VendorID in 
(select VendorID From Purchasing.PurchaseOrderHeader as poh 
Inner join Purchasing.Vendor as pv on poh.VendorID = pv.BusinessEntityID
group by VendorID
Having count(PurchaseOrderID) >= 30)
)

Select VendorID, AVG(SubTotal) as 'AVG Order',  (Select AVG(Subtotal) From MyCTE Where RowNumber Between 1 And 5) as 'AVG 5 Last Order'
From  MyCTE
group by VendorID

您怎么看?

sql greatest-n-per-group
1个回答
0
投票

如果我理解正确,您将尝试获取所有订单超过30的所有客户的平均所有订单的小计和最近5个订单的平均小计。

如果是这种情况,则最近5个订单的平均值不正确。您平均每个客户的最后5个订单。我做了一些改变。请注意,聚合函数将忽略空值。

WITH MyCTE (VendorID, OrderDate, PurchaseOrderID, SubTotal, RowNumber)

AS(SELECT poh.VendorID,订购日期,PurchaseOrderID,ROUND(小计,2)AS小计,ROW_NUMBER()超过(按供应商ID排序或按OrderDate DESC排序)为“行号”FROM Purchasing.PurchaseOrderHeader AS poh内部加盟采购商AS PV在poh.VendorID = pv.BusinessEntityID上WHERE PreferredVendorStatus ='0'AND ActiveFlag ='1'和poh.VendorID IN(选择供应商IDFROM Purchasing.PurchaseOrderHeader AS poh内部加盟采购商AS PV在poh.VendorID = pv.BusinessEntityID上按供应商ID分组拥有COUNT(PurchaseOrderID)> = 30))

SELECT供应商ID,AVG(小计)AS'AVG订单',AVG(行编号<= 5时的情况,然后小计ELSE空)AS'AVG 5 Last Order'来自MyCTE按供应商ID分组;

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