【问题标题】:Querying the Team names with more than a half wins (Database contains Home and Away Column for results)查询胜出半数以上的球队名称(数据库包含主场和客场列的结果)
【发布时间】:2019-09-30 10:06:18
【问题描述】:

我有一个表(会议),其中包含以下列:

  • 主队(varchar)
  • AwayTeam(varchar)
  • 首页(int)
  • 离开(整数)

对于分数(例如:3:2)。

我的问题是我需要输出所有胜率超过一半的球队。

提供的代码运行完美,但它仅适用于主场胜利,我需要主场和客场的总和,因为例如,“利物浦”有三场主场比赛和两场客场比赛,我需要双方分数。

SELECT Team, COUNT(*) AS HomeWins
FROM Teams
JOIN Meetings ON Team = Meetings.HomeTeam AND Meetings.Home > Meetings.Away
GROUP BY Team

预期输出是(从 6 支球队中,我有两支球队有 3 胜,另一支 - 4 胜)输出超过一半胜场的球队和他们的总胜场。

例子:

Team       Wins
Liverpool  4
PSG        3

【问题讨论】:

标签: sql


【解决方案1】:

如果你只想赢,你可以使用:

select t.*,
       (select count(*)
        from meetings m
        where (m.hometeam = t.team and m.home > m.away) or
              (m.awayteam = t.team and m.away > m.away)
       ) as num_wins
from team t;

注意:这会返回所有球队,包括那些没有赢得任何比赛的球队。

【讨论】:

  • 谢谢伙计,这很有效,但我需要过滤掉 5 场比赛中胜场数少于 3 场的球队。例如:巴塞罗那1W,拜仁3W,尤文图斯1W,利物浦4W,曼联2W,PSG 3W。我只想得到拜仁、利物浦和巴黎圣日耳曼。
  • @S1C4R10 。 . .我建议你问一个新的问题,这个问题更符合你的实际需求。
【解决方案2】:

您只需要查询两次结果,反转查询并使用 UNION 创建组合视图。

create table #meetings (HomeTeam varchar(20), AwayTeam varchar(20), Home int, Away int);


insert into #meetings (HomeTeam, AwayTeam, Home, Away)
values
    ('Trumpton', 'Camberwick Green', 1, 0), -- Trumpton win
    ('Chigley', 'Camberwick Green', 3, 2), -- Chigley win
    ('Trumpton', 'Chigley', 3, 1), -- Trumpton win
    ('Camberwick Green', 'Trumpton', 0, 2), -- Trumpton win
    ('Camberwick Green', 'Chigley', 1, 2) -- Chigley win

/*
Trumpton - played 3, won 3
Camberwick Green - played 4, won 0
Chigley - played 3, won 2
*/

select
    Team
    ,count(*) as Played
    ,sum(Win) as Wins
from
    (
    select
        HomeTeam as Team
        ,case when Home > Away then 1 else 0 end as Win
    from
        #meetings
    union all
    select
        AwayTeam as Team
        ,case when Away > Home then 1 else 0 end as Win
    from
        #meetings
    ) results

【讨论】:

    【解决方案3】:

    据我了解,您希望返回胜负多于球队的信息。如果这是正确的,这是一种方法:

    -- Build cte to re-use query
    WITH meetings(WinningTeam, LosingTeam) AS (
      SELECT
        CASE WHEN Home > Away THEN HomeTeam ELSE AwayTeam END AS WinningTeam,
        CASE WHEN Home > Away THEN AwayTeam ELSE HomeTeam END AS LosingTeam
      FROM Meetings
    )
    SELECT teams.Team, wins.win_count AS Wins
    FROM teams
    LEFT JOIN (
      SELECT WinningTeam, COUNT(*) AS win_count
      FROM Meetings
      GROUP BY 1
    ) wins ON teams.team = wins.WinningTeam -- Get wins per team
    LEFT JOIN (
      SELECT LosingTeam, count(*) AS loss_count
      FROM Meetings
      GROUP BY 1
    ) losses ON teams.team = wins.LosingTeam -- Get wins per team
    WHERE win_count > loss_count -- Only return teams with winning records
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-15
      相关资源
      最近更新 更多