我正在为我的SQL考试进行练习,但无法弄清楚以下问题:
“在每个客户支付的平均金额中,显示最高金额。”
因此,要检索平均支付的金额,我将执行以下操作:
SELECT AVG(Amount) AS 'Average amount paid'
FROM Payment;
然后,我想从该平均值列表中检索最高的平均值。我认为以下方法可以解决问题:
SELECT MAX(AVG(Amount)) AS 'Highest average amount paid'
FROM Payment;
这似乎不起作用。我收到以下错误:
无法对包含聚合或子查询的表达式执行聚合功能。
我希望对此有所帮助。解决这个问题的正确方法是什么?预先谢谢你。
答案 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
的内容。
答案 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)
。