【问题标题】:How to select MAX from AVG?如何从 AVG 中选择 MAX?
【发布时间】:2020-02-18 14:15:23
【问题描述】:

我正在练习我的 SQL 考试,但我无法弄清楚以下问题:

“在每位客户支付的平均金额中,显示最高金额。”

所以要检索支付的平均金额,我会执行以下操作:

SELECT AVG(Amount) AS 'Average amount paid'
FROM Payment;

然后我想从这个平均值列表中检索最高的平均值。我认为以下方法可以解决问题:

SELECT MAX(AVG(Amount)) AS 'Highest average amount paid'
FROM Payment;

这似乎不起作用。我收到以下错误:

无法对包含聚合或子查询的表达式执行聚合函数。

我需要一些帮助。解决这个问题的正确方法是什么?提前谢谢你。

【问题讨论】:

  • 使用哪个dbms?
  • 抱歉,应该说清楚。我正在使用 Microsoft SQL Server Management Studio。
  • 您已经有了一些答案,但是如果您仔细阅读要求,您应该意识到即使您的第一个 sql 查询是错误的。对吗?
  • 那么戈登的回答是行不通的。由于某些奇怪的原因,SQL Server 仅支持 FETCH FIRST 与 OFFSET 的组合。请改用 SELECT TOP。

标签: sql sql-server subquery sql-order-by aggregate-functions


【解决方案1】:

在 SQL Server 中,您可以对记录进行排序并使用TOP 1 仅保留数量最多的记录:

SELECT TOP 1 Customer_id, AVG(Amount) AS [Average amount paid]
FROM Payment
GROUP BY customer_id
ORDER BY [Average amount paid] DESC;

注意:要使此查询有意义,您需要一个 GROUP BY 子句。没有它,它只会返回一条记录,其中包含整个表中的平均付款。

【讨论】:

    【解决方案2】:

    尝试使用子查询:

    SELECT MAX(src.cust_avg) AS "Highest average amount paid"
    FROM (
      SELECT cust_id, AVG(Amount) AS cust_avg
      FROM Payment
      GROUP BY cust_id -- Get averages per customer
    ) src 
    ;
    

    要首先获得“每位客户”的平均值,您需要包含类似 GROUP BY cust_id 的内容。

    SQL Fiddle

    【讨论】:

    • 最后一行只是为了解释我在原始发帖人的初始查询中添加的GROUP BY。措辞令人困惑-您无需添加第二个GROUP BY。我会澄清的,谢谢。
    【解决方案3】:

    使用order by:

    select customer, avg(amount)
    from payment
    group by customer
    order by avg(amount) desc
    fetch first 1 row only;
    

    并非所有数据库都支持fetch first(虽然是标准的),因此您应该使用适合您的数据库的版本。

    在 SQL Server 中,您可以使用 select top (1)offset 0 fetch first 1 row only(唉,offset 不是可选的)。

    还有一些数据库,其中整数上的avg() 返回一个整数。如果amount 是一个整数并且您的数据库会这样做,那么请使用avg(amount * 1.0)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-03
      • 1970-01-01
      • 1970-01-01
      • 2015-08-23
      • 1970-01-01
      • 1970-01-01
      • 2018-06-06
      • 1970-01-01
      相关资源
      最近更新 更多