You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

获取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;

关键逻辑说明

  1. 锁定目标球员:通过子查询/JOIN先获取所有在2018赛季为Team A打过比赛的PlayerID,确保后续统计的是这些球员的全生涯数据;
  2. 生涯数据统计:外层查询针对这些球员的所有Team A参赛记录进行分组,计算总出场数(COUNT(*))和各项数据的场均(AVG());
  3. 语法合规性:GROUP BY包含所有非聚合字段(PlayerID, Surname, AKA),适配大多数数据库的SQL标准(比如MySQL的ONLY_FULL_GROUP_BY模式、PostgreSQL等)。

内容的提问来源于stack exchange,提问作者waflfootyfacts

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:23:40