使用两个CTE时无法执行GROUP BY的技术问题求助
解决SQL按俱乐部分组统计数据的问题
你原来的SQL存在两个核心问题:一是重复创建CTE做冗余关联,二是用笛卡尔积连接表导致数据混乱,且未对需要统计的字段做聚合操作,所以分组时报错。
直接修改成以下SQL即可实现按俱乐部分组统计的需求:
SELECT club.club_name, SUM(club_results.goals_scored) AS total_goals_scored, SUM(club_results.goals_conceded) AS total_goals_conceded, SUM(club_results.goals_scored - club_results.goals_conceded) AS total_goal_difference, SUM( CASE WHEN (club_results.goals_scored - club_results.goals_conceded) > 0 THEN 3 WHEN (club_results.goals_scored - club_results.goals_conceded) < 0 THEN 0 ELSE 1 END ) AS total_points FROM club_results INNER JOIN club ON club_results.club_id = club.club_id GROUP BY club.club_id, club.club_name;
关键修改说明:
- 去掉冗余的CTE,直接关联
club_results和club两张表,避免不必要的子查询/CTE - 对每场比赛的进球、失球用
SUM()做聚合,得到俱乐部的总进球数和总失球数 - 净胜球通过累加每场的进球差值得到,也可以写成
SUM(club_results.goals_scored) - SUM(club_results.goals_conceded),结果一致 - 积分需要先计算单场比赛的积分(胜3分、平1分、负0分),再用
SUM()累加得到俱乐部的总积分 GROUP BY中同时包含club_id和club_name,避免出现不同俱乐部重名导致的统计错误,同时符合SQL的分组规则(非聚合字段必须出现在GROUP BY中)
内容的提问来源于stack exchange,提问作者muhammedhyder
相关产品推荐
相关产品推荐

