SQL实现两列球队数据合并统计,生成正确无重复行统计结果
问题:统计各球队已完成赛事数量
需求:从数据表的Team1和Team2两列中提取所有球队名称,统一归入单个TEAM列,统计每个球队参与的已完成赛事数量(Completed=1代表赛事已完成)。
现有数据表数据:
| Event | Team1 | Team2 | Completed |
|---|---|---|---|
| Ducks vs Devils | Ducks | Devils | 1 |
| Ducks vs Bruins | Ducks | Bruins | 1 |
之前的错误尝试及问题
曾使用CASE WHEN语法尝试实现,但未得到正确结果:
CASE WHEN Team1 = "Bruins" or Team2 = "Bruins" then Bruins WHEN Team1 = "Devils" or Team2 = "Devils" then Devils WHEN Team1 = "Ducks" or Team2 = "Ducks" then Ducks ELSE "Other" END TEAM_CASES
得到的错误统计结果:
| Team | TotalCompleted |
|---|---|
| Bruins | 1 |
| Devils | 1 |
| Ducks | 0 |
问题核心:CASE WHEN是顺序匹配,仅返回第一个满足条件的结果。比如第一条记录Ducks vs Devils会被第二个分支(Devils的条件)匹配,不会走到Ducks的分支;第二条记录Ducks vs Bruins会被第一个分支(Bruins的条件)匹配,同样不会走到Ducks的分支,最终Ducks的统计数为0,完全不符合预期。
正确解法:拆分列后统计
想要正确统计每个球队的已完成赛事数,需要把每条赛事记录拆成两条——分别对应Team1和Team2的球队,再进行分组统计。使用UNION ALL实现列转行:
SELECT team, SUM(completed) AS Completed FROM ( -- 提取Team1列的球队及对应赛事完成状态 SELECT Team1 AS team, Completed FROM your_table_name WHERE Completed = 1 UNION ALL -- 提取Team2列的球队及对应赛事完成状态 SELECT Team2 AS team, Completed FROM your_table_name WHERE Completed = 1 ) AS all_teams GROUP BY team ORDER BY team;
说明
UNION ALL不会去重,确保每条赛事的两个球队都被计入统计;- 内层查询筛选
Completed=1,只统计已完成的赛事; - 外层通过
GROUP BY team分组,用SUM(completed)计算每个球队的已完成赛事总数。
正确统计结果
执行上述SQL后,将得到预期结果:
| Team | Completed |
|---|---|
| Bruins | 1 |
| Devils | 1 |
| Ducks | 2 |
内容的提问来源于stack exchange,提问作者Camila
相关产品推荐
相关产品推荐

