如何编写SQL查询按字典序配对球队并计算首队胜率?
解决球队配对场次与胜率的SQL方案
嘿,这问题我熟!要实现按字典序输出球队配对、场次和首队胜率,核心是先把所有主客队的配对统一成固定顺序(字典序小的在前),再统计计算。下面直接上可行的SQL和详细解释:
完整SQL代码
SELECT -- 按字典序确定配对的前后球队 LEAST(home_team, away_team) AS team1, GREATEST(home_team, away_team) AS team2, -- 统计该配对的总比赛场次 COUNT(*) AS total_matches, -- 计算team1的胜率:team1赢的场次/总场次,转成百分比格式 CONCAT(ROUND( SUM(CASE WHEN (LEAST(home_team, away_team) = home_team AND home_score > away_score) OR (LEAST(home_team, away_team) = away_team AND away_score > home_score) THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 0 ), '%') AS team1_win_rate FROM football_tournaments -- 按配对分组,确保同一组的比赛被聚合 GROUP BY LEAST(home_team, away_team), GREATEST(home_team, away_team) -- 按字典序排序输出 ORDER BY team1, team2;
关键逻辑解释
- 统一配对顺序:用
LEAST()和GREATEST()函数,不管比赛里谁是主队客队,都把字典序更小的球队放在team1,更大的放在team2,这样Australia vs England和England vs Australia会被归为同一组。 - 统计总场次:
COUNT(*)直接统计该配对下的所有比赛数量。 - 计算胜率:用
CASE语句判断team1是否赢了这场比赛:如果team1是主队,就看主队进球是否大于客队;如果team1是客队,就看客队进球是否大于主队。把这些赢的场次加起来,除以总场次再乘以100,用ROUND()取整后拼接百分号。 - 排序输出:最后按
team1和team2的字典序排序,完全符合你要的输出顺序。
举个实际例子,假设数据库里Australia和England有3场比赛,其中Australia赢了1场,输出结果就会是Australia | England | 3 | 33%,和你给出的示例格式完全匹配。
内容的提问来源于stack exchange,提问作者maxhellrocker
相关产品推荐
相关产品推荐

