在PGadmin4编写统计球场进球数SQL运行出现GROUP BY错误如何解决
报错原因及修复方案
核心报错原因
你收到的报错直接来源于内层第一个子查询的语法不符合PostgreSQL的执行规则:
- 该子查询中同时查询了非聚合字段
game.Stadiumid和聚合函数SUM(Amount),但没有添加GROUP BY game.Stadiumid子句。SQL要求使用聚合函数后,所有未被聚合包裹的查询字段都必须出现在GROUP BY子句中,否则就会抛出该字段未被分组或聚合的错误。
其他存在的逻辑问题
除了直接触发报错的问题外,你的查询还有几处逻辑错误会导致无法得到预期结果:
- 外层查询的
T.SUM(Amount)写法错误,内层子查询返回的临时表T中不存在Amount字段,只有已经聚合完成的总进球数字段Sum,不需要重复执行聚合操作 - UNION两侧子查询的列名未对齐,第二个子查询自定义的
unplayedStadiumid、unplayedSum别名虽然不会影响执行(UNION默认取第一个子查询的列名),但属于不规范写法,容易引发逻辑混淆 - 隐式连接
FROM game,score可读性差,更推荐使用显式的INNER JOIN写法明确关联逻辑 - 可以用
UNION ALL替代UNION,两个子查询返回的球场ID不会重复,不需要额外去重,能提升查询效率
修正后的查询代码
query = sql.SQL(""" SELECT T.Stadiumid, T.Sum FROM( SELECT game.Stadiumid, SUM(score.Amount) AS Sum FROM game INNER JOIN score ON game.Matchid = score.Matchid GROUP BY game.Stadiumid UNION ALL SELECT stadium.Stadiumid, 0 AS Sum FROM stadium WHERE stadium.Stadiumid NOT IN (SELECT DISTINCT game.Stadiumid FROM game) ) AS T ORDER BY T.Sum DESC, T.Stadiumid ASC """)
内容的提问来源于stack exchange,提问作者yellowcard123
相关产品推荐
相关产品推荐

