如何编写SQL查询counter值高于平均值的所有id_film
报错原因
聚合函数AVG()无法直接在普通WHERE子句中使用,且你需要先全局计算出所有电影计数的平均值,再做行级筛选,所以需要额外嵌套子查询计算平均值。
另外你原有查询里的WHERE sq1.id_film = id_film是恒成立的冗余条件,可以直接删除,不影响查询结果。
兼容所有主流数据库的实现写法
SELECT id_film, counter FROM ( SELECT id_film, COUNT(*) as counter FROM film_vorstellung GROUP BY id_film ) as sq1 WHERE counter > ( -- 子查询单独计算所有计数的平均值 SELECT AVG(counter) FROM ( SELECT COUNT(*) as counter FROM film_vorstellung GROUP BY id_film ) as sq2 );
简化写法(支持CTE的数据库可用,如MySQL 8.0+、PostgreSQL、SQL Server等)
用公共表表达式避免重复编写统计逻辑,可读性更高:
WITH film_count AS ( SELECT id_film, COUNT(*) as counter FROM film_vorstellung GROUP BY id_film ) SELECT id_film, counter FROM film_count WHERE counter > (SELECT AVG(counter) FROM film_count);
执行结果
按照你提供的测试数据,所有计数值的平均值为(1+1+1+2+3+1)/6 = 1.5,最终查询返回高于平均值的记录:
| id_film | counter |
|---|---|
| 6 | 2 |
| 2 | 3 |
内容的提问来源于stack exchange,提问作者Makouru
相关产品推荐
相关产品推荐

