我想计算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
------------------------------------
答案 0 :(得分:2)
加入表并使用条件聚合:
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。
答案 1 :(得分:1)
我建议横向连接:
select t1.team_id, t1.team_name, sum(v.goals),
sum(case when goals > other_goals then 3
when goals = other_goals then 1
else 0
end) as points
from t2 cross join lateral
(values (t2.home_team, t2.home_goals, t2.away_goals),
(t2.away_team, t2.away_goals, t2.home_goals)
) v(team, goals, other_goals) join
t1
on v.team = t1.team_id
group by t1.team_id, t1.team_name;
答案 2 :(得分:0)
您可以加入表并进行条件求和:
select
t1.team_id,
t1.team_name,
sum(
case
when t2.home_goals = t2.away_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
个而不是其名称存储在得分表中。
答案 3 :(得分:0)
现在,那
SELECT t1.teamid,
t1.teamname,
SUM (CASE WHEN t1.teamname = t2.hometeam
AND t2.homegoals > t2.awaygoals THEN 3
WHEN t1.teamname = t2.awayteam
AND t2.homegoals < t2.awaygoals THEN 3
WHEN t1.teamname IN (t2.hometeam, t2.awayteam)
AND t2.homegoals = t2.awaygoals THEN 1
ELSE 0
END
)AS "Team Points"
FROM t1
INNER JOIN
t2
ON
t1.teamname IN (t2.hometeam, t2.awayteam)
GROUP BY t1.teamid,
t1.teamname
这里是Demo