[英]Calculate average for Top n combined with SQL Group By
这是一个非常假设的示例,其中我连接了两个表(ORDERS和ORDHIST)。 我正在使用MS-ACCESS2010。我正在尝试编写一个联接或子查询,该联接或子查询将返回两个销售人员在DATE之前的TOP 2最近订单的平均值
命令
SalesPersonID OrderID 值
1123100
1 124 30
1125 55
2126 80
2127 20
1128 45
2129 60
2130 35
ORDHIST
OrderID 日期
123 22/03/2011
125 25/03/2011
127 29/03/2011
124 2011年3月24日
126 26/03/2011
128 30/03/2011
129 30/03/2011
130 2011年1月4日
我有SQL列出按SalesPersonID和Date排序的记录:
SELECT Orders.SalesPersonID, Orders.OrderID, Orders.Value, OrdHist.Date
FROM Orders
INNER JOIN OrdHist ON Orders.OrderID = OrdHist.OrderID
ORDER BY Orders.SalesPersonID, OrdHist.Date DESC;
SalesPersonID OrderID Value Date 1 128 45 30/03/2011 1 125 55 25/03/2011 1 124 30 24/03/2011 1 123 100 22/03/2011 2 130 35 01/04/2011 2 129 60 30/03/2011 2 127 20 29/03/2011 2 126 80 26/03/2011
因此,我现在想为每个SalesPerson选择前两行,并仅显示两行的平均值,以得出我正在寻找的最终结果:
SalesPersonID LatestAvg 1 50 2 47.5
我是编写联接和内部查询的新手,我无法超越SalesPerson提取所有订单的平均值
SELECT Orders.SalesPersonID, Avg(Orders.Value) AS AvgOfValue
FROM Orders
INNER JOIN OrdHist
ON Orders.OrderID = OrdHist.OrderID
GROUP BY Orders.SalesPersonID;
SalesPersonID AvgOfValue 1 57.5 2 48.75
但这不是在组中的最近2个日期进行过滤,因此,有关如何在子查询中进行选择或创建另一个联接的任何指导将不胜感激。
这是最终使用的SQL语句
SELECT SalesPersonID, AVG(Value) As AvgOfValue FROM (
SELECT Orders.SalesPersonID, Orders.Value
FROM ((Orders
INNER JOIN OrdHist ON Orders.OrderID = OrdHist.OrderID)
INNER JOIN Orders o2 on o2.SalesPersonId = Orders.SalesPersonId)
INNER JOIN OrdHist oh2 on oh2.OrderID = o2.OrderID and oh2.Date >= OrdHist.Date
GROUP BY Orders.SalesPersonID, Orders.OrderID, Orders.Value
HAVING COUNT(*) <= 2
) t1 GROUP BY SalesPersonID
您可以使用自我联接仅获得每个销售人员的前2行,并使用派生表将这些行的平均值分组。
SELECT SalesPersonID, AVG(Value) As AvgOfValue FROM (
SELECT Orders.SalesPersonID, Orders.Value
FROM Orders
INNER JOIN OrdHist ON Orders.OrderID = OrdHist.OrderID
INNER JOIN Orders o2 on o2.SalesPersonId = Orders.SalesPersonId
INNER JOIN OrderHist oh2 on oh2.OrderID = o2.OrderID and oh2.Date <= Orders.Date
GROUP BY Orders.SalesPersonID, Orders.OrderID, Orders.Value
HAVING COUNT(*) <= 2
) t1 GROUP BY SalesPersonID
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.