【问题标题】:Calculate average for Top n combined with SQL Group By结合 SQL Group By 计算 Top n 的平均值
【发布时间】:2015-03-04 05:33:58
【问题描述】:

这是一个非常假设的示例,我将连接两个表(ORDERS 和 ORDHIST)。我正在使用 MS-ACCESS 2010。我正在尝试编写一个联接或子查询,这将返回两位销售人员在 DATE 前 2 个最近订单的平均值
订单
SalesPersonID OrderID  
1                            123     100
1                            124     30
1                            125     55
2                            126     80
2                            127     20
1                            128     45
2                            129     60
2                            130     35

ORDHIST
OrderID    日期
123       22/03/2011
125       25/03/2011
127       29/03/2011
124       2011 年 3 月 24 日
126       26/03/2011
128       2011 年 3 月 30 日
129       2011 年 3 月 30 日
130       01/04/2011

我有 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 值日 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 选择前两行,并只显示这两行的平均值来给出我正在寻找的最终结果:

销售人员 ID 最新平均 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

但这并没有过滤组内最近 2 个日期,因此非常感谢任何有关如何在子查询中选择或创建另一个联接的指导

【问题讨论】:

    标签: sql ms-access join group-by subquery


    【解决方案1】:

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

      您可以使用自联接仅获取每个销售人员的前 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
      

      【讨论】:

      • 嗨 FuzzyTree,这正是我所追求的。有一些小错误需要更正,我不得不添加一些括号以使其与 Access 兼容,但我得到了我想要的答案。
      猜你喜欢
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-13
      • 2010-10-19
      相关资源
      最近更新 更多