SQL复杂条件聚合

问题描述 投票:0回答:3

我想计算PL中每个团队的积分

我有两个桌子

T1

---------------------
TEAM ID || TEAM NAME
---------------------
01      || Liverpool
02      || Man City
---------------------

例如t2时

----------------------------------------------------------------
MATCH ID || HOME TEAM || AWAY TEAM || HOME GOALS || AWAY GOALS|
-----------------------------------------------------------------
30       || Liverpool || Man City  || 1          || 0 
-----------------------------------------------------------------

计算积分现在,对于每场比赛,如果一个球队的进球数大于他赢得的另一支球队,他得到3分,而失败者得到0分但是,如果每个人都达到相同的目标数,甚至每个人只有1分。

新表应该像这样

-----------------------------------
Team ID || Team Name || Team Points
------------------------------------
01      || Liverpool || 28
02      || Man City  || 22
------------------------------------
sql postgresql
3个回答
0
投票

您可以加入表并进行条件求和:

select
    t1.team_id,
    t1.team_name,
    sum(
        case 
            when t2.home_goals = t1.home_goals then 1
            when 
                ( t1.team_name = t2.home_team and t2.home_goals > t2.away_team)
                or (t1.team_name = t2.away_team and t2.away_goals > t2.home_team)
                then 3
            else 0 
        end
    ) team_points
from t1
inner join t2 on t1.team_name in (t2.home_team, t2.away_team)
group by t1.team_id, t1.team_name

sum()中,case表达式检查游戏的结果并根据需要分配点数(获胜游戏为3点,平局为1点,输局为0点)。

注意:正如评论中所述,您应该修改架构以将团队的id而不是名称存储在得分表中。


0
投票

我建议使用横向连接:

select t1.team_id, t1.team_name, sum(v.goals)
from t2 cross join lateral
     (values (t2.home_team, t2.home_goals),
             (t2.away_team, t2.away_goals)
     ) v(team, goals) join
     t1
     on v.team = t1.team_id
group by t1.team_id, t1.team_name;

0
投票

加入表并使用条件聚合:

select t1.teamid, t1.teamname,
  sum(
    case sign((homegoals - awaygoals) * case when t1.teamname = t2.hometeam then 1 else -1 end)
      when 1 then 3
      when 0 then 1
      when -1 then 0
    end
  ) teampoints
from t1 inner join t2
on t1.teamname in (t2.hometeam, t2.awayteam)
group by t1.teamid, t1.teamname

请参见demo

© www.soinside.com 2019 - 2024. All rights reserved.