繁体   English   中英

有没有办法为特定条目过滤和排列 SQL 中的数据?

[英]Is there a way to filter and arrange data in SQL for a particular entry?

我有以下两个表

团队表

队号 队名
1个 姓名1
2个 名字2
3个 名字3
... ...

游戏分数表

游戏ID 主队(FK) 客队(FK) 主队得分 客队得分
1个 1个 2个 50 70
2个 1个 3个 70 80
3个 2个 1个 70 80
1个 2个 3个 50 60
2个 3个 1个 70 80
3个 3个 2个 40 90后
... ... ... ... ...

我正在尝试获得一张表格,其中我收到前 5 名进攻球队,即在所有比赛中得分最高的球队(按降序排列)。

例如,在所有比赛中得分最多的球队,无论是主场还是客场,都是 Name2 队,得分为 300 分。 他们应该是第一个(在有限的例子中)。

决赛桌

队名 总得分
名字2 300
姓名1 280
名字3 250
... ...

我不知道是否可以单独使用 sql 查询,或者我是否必须获取所有游戏的数据然后单独处理。

我们可以尝试以下联合方法:

SELECT t1.TeamName, SUM(t2.Score) AS TotalScore
FROM TeamsTable t1
INNER JOIN
(
    SELECT HomeTeam AS Team, HomeTeamScore AS Score FROM GameScoresTable
    UNION ALL
    SELECT AwayTeam, AwayTeamScore FROM GameScoresTable
) t2
    ON t2.Team = t1.TeamID
GROUP BY
    t1.TeamName;

如果你想找到前 5 名的总分,那么我们可以将上面的查询放入 CTE 中,并使用RANK

WITH cte AS (
    SELECT t1.TeamName, SUM(t2.Score) AS TotalScore,
           RANK() OVER (ORDER BY SUM(t2.Score) DESC) rnk
    FROM TeamsTable t1
    INNER JOIN
    (
        SELECT HomeTeam AS Team, HomeTeamScore AS Score FROM GameScoresTable
        UNION ALL
        SELECT AwayTeam, AwayTeamScore FROM GameScoresTable
    ) t2
        ON t2.Team = t1.TeamID
    GROUP BY t1.TeamName
)

SELECT TeamName, TotalScore
FROM cte
WHERE rnk <= 5
ORDER BY TotalScore DESC;

在 T-SQL (SQL Server) 中试试这个查询:

WITH cte AS (
    SELECT 
        TeamsTable.TeamName, 
        SUM(CASE WHEN TeamsTable.TeamID = GameScoresTable.HomeTeam THEN HomeTeamScore ELSE AwayTeamScore END) AS TotalScore
    FROM 
        TeamsTable
        JOIN GameScoresTable ON TeamsTable.TeamID = GameScoresTable.HomeTeam OR TeamsTable.TeamID = GameScoresTable.AwayTeam
    GROUP BY 
        TeamsTable.TeamName
)
SELECT 
    TeamName, TotalScore
FROM 
    cte
ORDER BY 
    TotalScore DESC
OFFSET 0 ROWS 
FETCH NEXT 5 ROWS ONLY;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM