如何从AVG中选择MAX?

时间:2019-10-22 12:16:33

标签: sql sql-server

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

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

因此,要检索平均支付的金额,我将执行以下操作:

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

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

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

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

  

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

我希望对此有所帮助。解决这个问题的正确方法是什么?预先谢谢你。

3 个答案:

答案 0 :(得分:0)

尝试使用子查询:

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

答案 1 :(得分:0)

在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 :(得分:-1)

使用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)