我有一个表,该表包含团队名称(HomeTeam,AwayTeam)的列,这些列是字符串,然后是一些统计信息,然后是home_points和away_points列。我想创建一个查询或过程以汇总每个团队的分数并按最高分对其进行排序。问题在于该团队有时是HomeTeam,有时是AwayTeam,并且对应于home_points或away_points。我想我对SQL的了解并不广泛,因此我找不到该问题的另一个示例。我试图通过一些联接来做到这一点,但是我仍然不知道如何解决这个问题。该表如下所示:
id HomeTeam AwayTeam home_points away_points
1 Team1 Team2 3 0
2 Team3 Team1 1 1
3 Team2 Team4 0 3
4 Team1 Team4 0 3
Run Code Online (Sandbox Code Playgroud)
我希望结果表看起来像:
Position Team Points
1 Team4 6
2 Team1 4
3 Team3 1
4 Team2 0
Run Code Online (Sandbox Code Playgroud)
我在最小示例中做了一个SQL提琴。
先感谢您。
使用联合:
SELECT
ROW_NUMBER() OVER (ORDER BY SUM(Points) DESC) Position,
Team,
SUM(Points) AS Points
FROM
(
SELECT HomeTeam AS Team, home_points AS Points FROM matches UNION ALL
SELECT AwayTeam, away_points FROM matches
) t
GROUP BY
Team
ORDER BY
Points DESC;
Run Code Online (Sandbox Code Playgroud)
该答案假设您使用的是MySQL 8+(将来对此问题的任何读者越来越有可能)。如果您使用的是早期版本的MySQL,我们可以使用用户变量模拟行号以生成所需的位置。这是您可以执行的操作:
SELECT
@rn := @rn + 1 AS Position,
t.Team,
t.Points
FROM
(
SELECT
t.Team,
SUM(t.Points) AS Points
FROM
(
SELECT HomeTeam AS Team, home_points AS Points FROM matches UNION ALL
SELECT AwayTeam, away_points FROM matches
) t
GROUP BY
t.Team
) t, (SELECT @rn := 0) r
ORDER BY
t.Points DESC;
Run Code Online (Sandbox Code Playgroud)