You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL如何从胜负记录表统计每位玩家的胜场与负场数量

实现方案

这里提供两种兼容绝大多数数据库的实现方式:

方法1:拆分行后聚合(逻辑最直观,全版本兼容)

将每场比赛拆为胜者、负者两条独立记录,分别标记胜/负计数后分组求和即可:

SELECT 
  player_name,
  SUM(is_win) AS number_wins,
  SUM(is_loss) AS number_losses
FROM (
  SELECT winner_name AS player_name, 1 AS is_win, 0 AS is_loss FROM my_table
  UNION ALL
  SELECT loser_name AS player_name, 0 AS is_win, 1 AS is_loss FROM my_table
) AS player_records
GROUP BY player_name
ORDER BY player_name;

方法2:分维度统计后关联(适合大数据量场景)

先分别统计胜场、负场的聚合结果,再用所有玩家的全集关联两个统计结果,避免拆行带来的临时数据量膨胀:

WITH all_players AS (
  -- 获取所有参赛玩家的全集
  SELECT winner_name AS player_name FROM my_table
  UNION
  SELECT loser_name AS player_name FROM my_table
),
win_stats AS (
  -- 统计胜场
  SELECT winner_name AS player_name, COUNT(*) AS number_wins FROM my_table GROUP BY winner_name
),
loss_stats AS (
  -- 统计负场
  SELECT loser_name AS player_name, COUNT(*) AS number_losses FROM my_table GROUP BY loser_name
)
SELECT 
  p.player_name,
  COALESCE(w.number_wins, 0) AS number_wins,
  COALESCE(l.number_losses, 0) AS number_losses
FROM all_players p
LEFT JOIN win_stats w ON p.player_name = w.player_name
LEFT JOIN loss_stats l ON p.player_name = l.player_name
ORDER BY p.player_name;

如果使用不支持CTE的低版本数据库,将上述CTE部分替换为对应子查询即可正常运行。两种方案返回的结果都和你要求的输出结构完全一致。

内容的提问来源于stack exchange,提问作者B. Bachir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 18:15:04