PostgreSQL子查询报错修复及平均付款金额计算需求求助
修正后的SQL语句
SELECT AVG(total_payment) AS average_total_amount_paid FROM ( SELECT B.customer_id, B.first_name, B.last_name, D.city, E.country, SUM(amount) AS total_payment FROM payment A INNER JOIN customer B ON A.customer_id = B.customer_id INNER JOIN address C ON B.address_id = C.address_id INNER JOIN city D ON C.city_id = D.city_id INNER JOIN country E ON D.country_id=E.country_id WHERE D.city IN ('Aurora', 'Atlixco', 'Xintai','Adoni', 'Dhule (Dhulia)', 'Kurashiki', 'Pingxiang', 'Sivas', 'Celaya', 'So Leopoldo') GROUP BY B.customer_id, B.first_name, B.last_name, D.city, E.country ORDER BY total_payment DESC LIMIT 5 ) AS total_amount_paid
原有代码的报错原因
- 字段引用错误:子查询里每个客户的付款总额别名是
total_payment,外层计算平均值时应该调用这个字段,你错误调用了子查询的表别名total_amount_paid - 别名格式错误:
average.total_amount_paid作为字段别名不能包含.符号,这是SQL保留的表和字段关联标识符,不能直接用作别名内容 - 缺少前5名筛选逻辑:题目要求统计付款总额最高的前5名客户,你没在子查询里加
ORDER BY total_payment DESC LIMIT 5筛选符合条件的客户 - 多余的GROUP BY:外层要算的是5个客户的整体平均付款额,最终只返回1个结果,不需要加GROUP BY子句,加了反而会强制按平均值分组,完全不符合需求
- 外层引用无效别名:你第二步写的外层语句还在调用B、D、E等表别名,这些别名只在子查询内部生效,外层只能通过子查询的别名
total_amount_paid调用子查询返回的字段
实现逻辑说明
- 内层子查询的作用:先统计符合城市筛选条件的每个客户的总付款额,按付款额倒序排序后取前5名,子查询整体别名设为
total_amount_paid,相当于一张临时表,存储了符合要求的前5名客户的所有数据 - 外层查询的作用:直接对这张临时表里的
total_payment字段(也就是每个客户的总付款额)求平均值,得到的就是前5名客户的平均付款金额
内容的提问来源于stack exchange,提问作者DataVE
相关产品推荐
相关产品推荐

