获取2018赛季参赛球员生涯场均数据的SQL查询问题排查
解决思路与修正后的SQL
你的问题核心是没有先锁定「至少在2018赛季为Team A出战过」的球员范围,再加上原查询的分组逻辑有问题,才导致只返回了2018赛季的单赛季数据。下面是具体的修正方案:
问题根源分析
原SQL存在两个关键问题:
- 你在
SELECT中包含了Season字段,但GROUP BY仅指定了Player(应该是PlayerID这类唯一标识),这会导致分组逻辑错误——比如按「球员+赛季」分组,而非统计球员的生涯整体数据; - 没有先筛选出「2018赛季参赛过的Team A球员」,所以无法针对这些球员的全生涯记录做统计。
修正后的SQL写法
这里提供两种常用的实现方式,都能精准筛选目标球员并计算他们的生涯场均:
写法1:使用子查询筛选目标球员
SELECT pd.PlayerID, pd.Surname, pd.AKA, COUNT(*) AS Played, ROUND(AVG(pd.Kicks), 1) AS K, ROUND(AVG(pd.Handballs), 1) AS HB, ROUND(AVG(pd.Marks), 1) AS M FROM PlayerDetails pd WHERE pd.Team = 'Team A' -- 先筛选出2018赛季为Team A出战过的球员ID AND pd.PlayerID IN ( SELECT DISTINCT PlayerID FROM PlayerDetails WHERE Team = 'Team A' AND Season = 2018 ) -- 按球员唯一标识分组,确保统计生涯整体数据 GROUP BY pd.PlayerID, pd.Surname, pd.AKA;
写法2:使用INNER JOIN筛选目标球员
如果你的数据库对嵌套子查询性能敏感,可以用JOIN替代:
SELECT pd.PlayerID, pd.Surname, pd.AKA, COUNT(*) AS Played, ROUND(AVG(pd.Kicks), 1) AS K, ROUND(AVG(pd.Handballs), 1) AS HB, ROUND(AVG(pd.Marks), 1) AS M FROM PlayerDetails pd -- 关联2018赛季参赛的球员列表 INNER JOIN ( SELECT DISTINCT PlayerID FROM PlayerDetails WHERE Team = 'Team A' AND Season = 2018 ) AS 2018_players ON pd.PlayerID = 2018_players.PlayerID WHERE pd.Team = 'Team A' GROUP BY pd.PlayerID, pd.Surname, pd.AKA;
关键逻辑说明
- 锁定目标球员:通过子查询/JOIN先获取所有在2018赛季为Team A打过比赛的
PlayerID,确保后续统计的是这些球员的全生涯数据; - 生涯数据统计:外层查询针对这些球员的所有Team A参赛记录进行分组,计算总出场数(
COUNT(*))和各项数据的场均(AVG()); - 语法合规性:
GROUP BY包含所有非聚合字段(PlayerID,Surname,AKA),适配大多数数据库的SQL标准(比如MySQL的ONLY_FULL_GROUP_BY模式、PostgreSQL等)。
内容的提问来源于stack exchange,提问作者waflfootyfacts
相关产品推荐
相关产品推荐

