[英]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.