【发布时间】:2021-09-22 00:03:42
【问题描述】:
我最近开始练习 SQL,之前有一些 MySQL 经验,仅用于网站数据库管理,但没有实际的 SQL 查询构造。 之前已经询问过此练习的变体,但我想扩大以前解决方案的范围。 这是一个足球(足球)得分练习,构建了一个小联盟中不同比赛的汇总结果表。
TL;DR 我设法获得了部分解决方案,但想在决赛桌中再添加 3 列,并改进计算最终排名的方式。
我创建了一个包含 4 个团队的表格,并为每个团队分配了一个 ID:
CREATE TABLE Teams AS
SELECT 100 AS TEAM_ID, 'PUMP' AS TEAM UNION ALL
SELECT 200, 'UP' UNION ALL
SELECT 300, 'THE' UNION ALL
SELECT 400, 'JAM';
输出是:
SELECT * FROM Teams
还有一张桌子:
| TEAM_ID | TEAM |
|---|---|
| 100 | PUMP |
| 200 | UP |
| 300 | THE |
| 400 | JAM |
然后我创建了第二个表格,其中包含游戏的比赛得分:
CREATE TABLE Matches AS
SELECT 1 AS MATCH_ID, 100 AS HomeTeam, 200 AS AwayTeam, 2 AS HomeScore, 0 AS AwayScore UNION ALL
SELECT 2, 300, 400, 1, 1 UNION ALL
SELECT 3, 400, 100, 0, 1 UNION ALL
SELECT 4, 300, 200, 2, 3 UNION ALL
SELECT 5, 200, 400, 0, 0 UNION ALL
SELECT 6, 300, 100, 1, 0;
接收:
| MATCH_ID | HomeTeam | AwayTeam | HomeScore | AwayScore |
|---|---|---|---|---|
| 1 | 100 | 200 | 2 | 0 |
| 2 | 300 | 400 | 1 | 1 |
| 3 | 400 | 100 | 0 | 1 |
| 4 | 300 | 200 | 2 | 3 |
| 5 | 200 | 400 | 0 | 0 |
| 6 | 300 | 100 | 1 | 0 |
我能够创建一个总分表,显示每支球队的联赛总分,并遵循以下指点规则:
- 球队获胜得 3 分,
- 球队打平得 1 分,
- 队伍输了得 0 分
WITH cteHomePoints AS (SELECT HomeTeam AS Team,
CASE
WHEN HomeScore > AwayScore THEN 3
WHEN HomeScore = AwayScore THEN 1
ELSE 0
END AS Points
FROM Matches),
cteAwayPoints AS (SELECT AwayTeam AS Team,
CASE
WHEN AwayScore > HomeScore THEN 3
WHEN AwayScore = HomeScore THEN 1
ELSE 0
END AS Points
FROM Matches),
cteAllPoints AS (SELECT Team, Points FROM cteHomePoints
UNION ALL
SELECT Team, Points FROM cteAwayPoints)
SELECT t.TEAM_ID, t.TEAM, COALESCE(SUM(ap.POINTS), 0) AS TOTAL_POINTS
FROM Teams t
LEFT OUTER JOIN cteAllPoints ap
ON ap.TEAM = t.TEAM_ID
GROUP BY t.TEAM_ID, t.TEAM
ORDER BY COALESCE(SUM(POINTS), 0) DESC, t.TEAM_ID
生成此表:
| TEAM_ID | TEAM | TOTAL_POINTS |
|---|---|---|
| 100 | PUMP | 6 |
| 200 | UP | 4 |
| 300 | THE | 4 |
| 400 | JAM | 2 |
不过,有两件事我想完成:
- 我想在决赛桌中再添加 3 列以显示给每个团队:
- GoalsScored
- 收到的目标
- 差异(得分和接受之间)
- 球队位置由积分数决定,如果并列,则位置由更好的“净胜球”决定,即进球数减去获得的进球数。这会影响最终排名(第二名和第三名会互换位置)。
我尝试了几种不同的方式进行调整,例如添加
cteHomeScore AS (SELECT HomeTeam AS Team,
END AS Scored
FROM Matches),
cteAwayScore AS (SELECT AwayTeam AS Team,
END AS Received
FROM Matches),
cteAllScored AS (SELECT Team, Scored FROM cteHomeScore
UNION ALL
SELECT Team, Received FROM cteAwayScore),
但我似乎无法破解它。
任何帮助将不胜感激:)
【问题讨论】:
-
您可以将得分、获得的目标和差异添加到您现有的得分确定 cte 中,然后以相同的方式进行总结。之后,您可以订购您想要的结果。
-
@Parfait GoalsScored 是球队在所有比赛中的总进球数(来自 HomeScore 和 AwayScore)。 GoalsReceived 是球队的对手在比赛中的总进球数(来自 HomeScore 和 AwayScore)。例如,团队 PUMP (ID 100),打进 3 个进球 (GoalsScored=3),并获得 1 个进球 (GoalsReceived=1)。