1841. 联赛信息统计 - 力扣(LeetCode)

  1. 1841. 联赛信息统计 - 力扣(LeetCode)

  2. 目标

    1. 输入

      表: Teams
      team_idteam_name
      1Ajax
      4Dortmund
      6Arsenal
      表: Matches
      home_team_idaway_team_idhome_team_goalsaway_team_goals
      1401
      1633
      4152
      6100
    2. 输出

      输出
      team_namematches_playedpointsgoal_forgoal_againstgoal_diff
      Dortmund26624
      Arsenal22330
      Ajax4259-4
  3. 分析

    写一段SQL,用来报告联赛信息. 统计数据应使用已进行的比赛来构建,其中 获胜 球队获得 三分 ,而失败球队获得 零分 。如果 打平 ,两支球队都得 一分 。

    result 表的每行应包含以下信息:

    team_name - Teams 表中的队伍名字
    matches_played - 主场与客场球队进行的比赛次数.
    points - 球队获得的总分数.
    goal_for - 球队在所有比赛中获取的总进球数
    goal_against - 球队在所有比赛中,他的对手球队的所有进球数
    goal_diff - goal_for - goal_against.
    按 points 降序 返回结果表。 如果两队或多队得分相同,则按 goal_diff 降序 排列。 如果仍然存在平局,则以 team_name 按字典顺序 排列它们。
    表: Teams表: Matches输出
    team_idteam_namehome_team_idaway_team_idhome_team_goalsaway_team_goalsteam_namematches_playedpointsgoal_forgoal_againstgoal_diff
    1Ajax1401Dortmund26624
    4Dortmund1633Arsenal22330
    6Arsenal4152Ajax4259-4
    6100
    判断主场球队和客场球队的积分home_team_idaway_team_idhome_team_goalsaway_team_goalshome_team_scoreaway_team_score队伍作为主队时的得分,对手得分,比赛积分UNION ALL 作为客队时的得分,对手得分,比赛积分,排序team_idgoal_forgoal_againstteam_score分组聚合计算比赛次数,积分,进球,失球,净胜球team_namematches_playedpointsgoal_forgoal_againstgoal_diff
    1401031010Dortmund26624
    1633111331Arsenal22330
    4152304523Ajax4259-4
    6100116001
    4103
    6331
    1250
    1001
  4. 实现

    DROP TABLE IF EXISTS matches;
    Create table If Not Exists Teams (team_id int, team_name varchar(20));
    Create table If Not Exists Matches (home_team_id int, away_team_id int, home_team_goals int, away_team_goals int);
    Truncate table Teams;
    insert into Teams (team_id, team_name) values ('1', 'Ajax');
    insert into Teams (team_id, team_name) values ('4', 'Dortmund');
    insert into Teams (team_id, team_name) values ('6', 'Arsenal');
    Truncate table Matches;
    insert into Matches (home_team_id, away_team_id, home_team_goals, away_team_goals) values ('1', '4', '0', '1');
    insert into Matches (home_team_id, away_team_id, home_team_goals, away_team_goals) values ('1', '6', '3', '3');
    insert into Matches (home_team_id, away_team_id, home_team_goals, away_team_goals) values ('4', '1', '5', '2');
    insert into Matches (home_team_id, away_team_id, home_team_goals, away_team_goals) values ('6', '1', '0', '0');
    SELECT * FROM teams;
    SELECT * FROM matches;
    
    # 判断主场球队和客场球队的积分
    SELECT *,
           CASE WHEN home_team_goals > away_team_goals THEN 3
           WHEN home_team_goals = away_team_goals THEN 1
           ELSE 0 END home_team_score,
           CASE WHEN home_team_goals < away_team_goals THEN 3
           WHEN home_team_goals = away_team_goals THEN 1
           ELSE 0 END away_team_score
    FROM matches;
    # 队伍作为主队时的得分,对手得分,比赛积分UNION ALL 作为客队时的得分,对手得分,比赛积分,排序
    WITH t1 AS ( SELECT *,
           CASE WHEN home_team_goals > away_team_goals THEN 3
           WHEN home_team_goals = away_team_goals THEN 1
           ELSE 0 END home_team_score,
           CASE WHEN home_team_goals < away_team_goals THEN 3
           WHEN home_team_goals = away_team_goals THEN 1
           ELSE 0 END away_team_score
    FROM matches )
    SELECT home_team_id team_id ,home_team_goals goal_for,away_team_goals goal_against ,home_team_score team_score
    FROM t1
    UNION ALL
    SELECT away_team_id,away_team_goals,home_team_goals,away_team_score
    FROM t1;
    # 分组聚合计算比赛次数,积分,进球,失球,净胜球
    WITH t1 AS ( SELECT *,
           CASE WHEN home_team_goals > away_team_goals THEN 3
           WHEN home_team_goals = away_team_goals THEN 1
           ELSE 0 END home_team_score,
           CASE WHEN home_team_goals < away_team_goals THEN 3
           WHEN home_team_goals = away_team_goals THEN 1
           ELSE 0 END away_team_score
    FROM matches )
    ,t2 AS ( SELECT home_team_id team_id ,home_team_goals goal_for,away_team_goals goal_against ,home_team_score team_score
    FROM t1
    UNION ALL
    SELECT away_team_id,away_team_goals,home_team_goals,away_team_score
    FROM t1 )
    SELECT team_name,count(t2.team_id)matches_played ,sum(team_score) points,sum(goal_for)goal_for,sum(goal_against)goal_against,sum(goal_for)-sum(goal_against) goal_diff
    FROM t2
    JOIN teams ON Teams.team_id=t2.team_id
    GROUP BY team_name
    ORDER BY points DESC,goal_diff DESC,team_name

  5. 小结

        case...when判断积分,union all球队每场比赛的信息,分组聚合求结果,排序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值