繁体   English   中英

计算前n个与SQL Group By相结合的平均值

[英]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列出按SalesPersonIDDate排序的记录:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM