SQL统计特定值与求和:如何使用GROUP BY计算球队比赛数据
用GROUP BY统计球队比赛数据的解决方案
嘿,我明白你想统计每个球队的参赛场次、总得分这类数据的需求,而且已经知道GROUP BY是关键,但不知道怎么结合你的表结构来用——毕竟你的RECORD表里每个比赛有两个球队,得先把数据整理成适合GROUP BY的格式才行!
先理清数据结构问题
你的RECORD表每一行是一场比赛,每个球队可能出现在MATCH_A或MATCH_B列里,对应的得分分别是A_SCORE和B_SCORE。所以第一步得把这两列的球队数据“拆”成一列,这样才能统一统计每个球队的所有比赛记录。
具体SQL实现
下面的SQL会先通过UNION ALL把每场比赛的两个球队拆成独立行,再用GROUP BY按球队ID分组统计:
-- 先拆分比赛记录,把每个球队的每场比赛单独成行 WITH TeamMatches AS ( SELECT MATCH_A AS TeamID, A_SCORE AS TeamScore, B_SCORE AS OpponentScore FROM RECORD UNION ALL SELECT MATCH_B AS TeamID, B_SCORE AS TeamScore, A_SCORE AS OpponentScore FROM RECORD ) -- 分组统计每个球队的比赛数据 SELECT t.TeamID, t.TeamName, COUNT(*) AS TotalMatches, -- 总参赛场次 SUM(tm.TeamScore) AS TotalScore, -- 总得分 SUM(tm.OpponentScore) AS TotalConceded -- 总失分 FROM TeamMatches tm JOIN TEAM t ON tm.TeamID = t.TeamID GROUP BY t.TeamID, t.TeamName ORDER BY t.TeamID;
代码解释
- CTE
TeamMatches:用UNION ALL把每场比赛拆成两条记录——一条是主队(MATCH_A)的得分和失分,一条是客队(MATCH_B)的得分和失分,这样每个球队的所有参赛记录都被统一整理到了TeamID列下。 - GROUP BY部分:按
TeamID和TeamName分组(因为TeamName和TeamID是一一对应的,所以可以一起分组),然后用COUNT(*)统计总场次,SUM()计算总得分和总失分。 - JOIN TEAM表:关联TEAM表来获取球队名称,让结果更直观。
验证你的例子
比如球队1(Apes),在RECORD表里的参赛记录有:
- 3/1 作为MATCH_A对阵3号球队
- 4/1 作为MATCH_A对阵9号球队
- 7/1 作为MATCH_B对阵4号球队
总共3场,运行上面的SQL后,TotalMatches列对应球队1的值就是3,完全符合你的描述~
内容的提问来源于stack exchange,提问作者user99192
相关产品推荐
相关产品推荐

