在两个不同的列中按值求和

Ren*_*neš 1 mysql sql

我有一个表,该表包含团队名称(HomeTeamAwayTeam)的列,这些列是字符串,然后是一些统计信息,然后是home_pointsaway_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提琴

先感谢您。

Tim*_*sen 7

使用联合:

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)

SQL演示的屏幕截图

演示版

  • 这是因为“ ROW_NUMBER()”是较新的mysql命令@BilalSiddiqui (2认同)