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

如何将两个SQL查询结果合并为含球队战绩的单表查询

合并球队参赛场次与获胜场次统计的SQL方案

你尝试用UNION合并失败的原因是:UNION用于合并行数据集,要求两个查询的列数、顺序、数据类型完全一致,而你需要的是将两个统计维度(参赛场次、获胜场次)合并到同一行,因此应该使用JOIN关联或单表统计的方式。

方案一:子查询关联(逻辑清晰)

通过两个子查询分别统计参赛、获胜场次,再关联球队表得到合并结果:

SELECT
    t.name AS `Team Name`,
    COALESCE(m_played.Matches_Played, 0) AS `Matches Played`,
    COALESCE(m_won.Matches_Won, 0) AS `Matches Won`
FROM test.team t
LEFT JOIN (
    -- 统计各球队参赛场次
    SELECT
        t2.name,
        COUNT(*) AS Matches_Played
    FROM test.team t2
    INNER JOIN test.match_scores m 
        ON m.home_team = t2.id OR m.away_team = t2.id
    GROUP BY t2.name
) m_played ON t.name = m_played.name
LEFT JOIN (
    -- 统计各球队获胜场次
    SELECT
        t2.name,
        COUNT(*) AS Matches_Won
    FROM test.team t2
    INNER JOIN test.match_scores m 
        ON m.winner = t2.id
    GROUP BY t2.name
) m_won ON t.name = m_won.name
ORDER BY `Matches Played` DESC, `Matches Won` DESC;

方案二:单表统计(效率更高)

直接通过CASE语句在一次表关联中完成两个维度的统计,减少表关联次数:

SELECT
    t.name AS `Team Name`,
    -- 统计参赛场次:球队作为主场或客场的次数
    SUM(CASE WHEN m.home_team = t.id OR m.away_team = t.id THEN 1 ELSE 0 END) AS `Matches Played`,
    -- 统计获胜场次:球队成为胜者的次数
    SUM(CASE WHEN m.winner = t.id THEN 1 ELSE 0 END) AS `Matches Won`
FROM test.team t
LEFT JOIN test.match_scores m 
    ON m.home_team = t.id OR m.away_team = t.id OR m.winner = t.id
GROUP BY t.id, t.name
ORDER BY `Matches Played` DESC, `Matches Won` DESC;

关键说明

  • 使用LEFT JOIN+COALESCE(方案一)或LEFT JOIN(方案二)可以确保所有球队都被列出,哪怕没有参赛或获胜记录,结果中对应数值会显示为0;如果只需要显示有参赛记录的球队,将LEFT JOIN替换为INNER JOIN即可。
  • UNION无法满足需求的核心原因:它会把两个查询的结果行上下拼接,最终同一球队会出现两行记录(一行显示获胜数,一行显示参赛数),而非同一行展示两个统计值。

内容的提问来源于stack exchange,提问作者Asad Hussain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 21:50:12