技术问询:从不同数据表求和计算冰球池球队每周球员总积分
冰球池队每周总积分计算SQL方案
没问题,我来帮你搞定这个积分计算的逻辑!根据你给出的表结构,需要把滑冰球员和门将的有效积分(Status为True的记录)按队按周汇总,下面是具体的实现思路和SQL代码:
核心思路
- 分别统计滑冰球员和门将的每周各队有效积分(只计算
Status = True的记录,因为False状态的球员积分应该不计入) - 将两个统计结果合并,按队和周求和得到总积分
- 关联
PoolTeams表,把队ID对应成队名,让结果更易读
完整SQL代码
假设你还有一张门将统计的表MondayGoalieStats(结构和MondaySkaterStats类似,包含Player、Weeknumber、PoolTeam、PTS、Status字段),可以用以下查询:
SELECT pt.PoolTeamID, pt.PoolTeamName, COALESCE(s.Weeknumber, g.Weeknumber) AS Weeknumber, -- 处理无积分的情况,用0替代NULL避免求和错误 COALESCE(s.SkaterTotal, 0) + COALESCE(g.GoalieTotal, 0) AS TotalWeeklyPoints FROM PoolTeams pt -- 关联滑冰球员的周积分统计 LEFT JOIN ( SELECT PoolTeam, Weeknumber, SUM(PTS) AS SkaterTotal FROM MondaySkaterStats WHERE Status = True GROUP BY PoolTeam, Weeknumber ) s ON pt.PoolTeamID = s.PoolTeam -- 关联门将的周积分统计,同时匹配周数 LEFT JOIN ( SELECT PoolTeam, Weeknumber, SUM(PTS) AS GoalieTotal FROM MondayGoalieStats WHERE Status = True GROUP BY PoolTeam, Weeknumber ) g ON pt.PoolTeamID = g.PoolTeam AND s.Weeknumber = g.Weeknumber -- 按队和周排序,结果更清晰 ORDER BY pt.PoolTeamID, Weeknumber;
代码说明
- 子查询分别对滑冰球员和门将的数据做分组聚合,只计算有效状态的积分
LEFT JOIN保证所有池队都会出现在结果中,哪怕某周没有任何球员获得积分COALESCE函数用来处理NULL值:如果某队某周没有滑冰/门将积分,就用0代替,这样求和时不会出现NULL结果- 最终结果会显示每个队的ID、名称、周数和该周的总积分
如果你的门将表结构不同,或者需要调整筛选条件,只需要修改对应的子查询部分就可以啦!
内容的提问来源于stack exchange,提问作者navaidstech
相关产品推荐
相关产品推荐

