我想计算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
------------------------------------
您可以加入表并进行条件求和:
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
而不是名称存储在得分表中。
我建议使用横向连接:
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;
加入表并使用条件聚合:
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。