Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
计算前n名与SQL Group By组合的平均值_Sql_Ms Access_Join_Group By_Subquery - Fatal编程技术网

计算前n名与SQL Group By组合的平均值

计算前n名与SQL Group By组合的平均值,sql,ms-access,join,group-by,subquery,Sql,Ms Access,Join,Group By,Subquery,这是一个非常假设的例子,我将两个表ORDERS和ORDHIST连接起来。我正在使用MS-ACCESS 2010。我正在尝试编写一个联接或子查询,它将返回两个销售人员在日期前的前2个最近订单的平均值 命令 SalesorSonid OrderIDValue 1 123 100 1 12430 1 12555 2 12680 2 12720 1 12845 2 12960 213035 奥德斯特 订单日期 12322/03/2011 12525/03/2011 12729/03/20

这是一个非常假设的例子,我将两个表ORDERS和ORDHIST连接起来。我正在使用MS-ACCESS 2010。我正在尝试编写一个联接或子查询,它将返回两个销售人员在日期前的前2个最近订单的平均值 命令 SalesorSonid OrderIDValue 1 123 100 1 12430 1 12555 2 12680 2 12720 1 12845 2 12960 213035

奥德斯特 订单日期 12322/03/2011 12525/03/2011 12729/03/2011 12424/03/2011 12626/03/2011 12830/03/2011 12930/03/2011 13001/04/2011

我有SQL来列出按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

这是最后使用的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

嗨,FuzzyTree,那正是我想要的。有一些小的拼写错误需要更正,我不得不添加一些括号以使其与Access兼容,但我得到了我想要的答案。 SalesPersonID LatestAvg 1 50 2 47.5
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
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
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