计算前n名与SQL Group By组合的平均值
这是一个非常假设的例子,我将两个表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和日期排序的记录:计算前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
但这并不是对组中最近的两个日期进行筛选,因此对于如何在子查询中选择或创建另一个联接的任何指导都将非常受欢迎您可以使用自联接仅获取每个销售人员的前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