【问题标题】:Select displaying incorrect results for matches and teams选择为比赛和球队显示不正确的结果
【发布时间】:2016-06-03 22:30:03
【问题描述】:

根据下面的查询,我有几个问题:

SELECT
    RANK() OVER (PARTITION BY a.LeagueID ORDER BY a.LeagueID) AS WeekNumber,
    a.TeamID AS HomeTeamID,
    a.TeamAbbreviation AS HomeTeam,
    b.TeamID AS AwayTeamID,
    b.TeamAbbreviation AS AwayTeam,
    a.LeagueID AS HomeLeague,
    b.LeagueID AS AwayLeague
FROM 
    dbo.Team a
CROSS JOIN 
    dbo.Team b
WHERE 
    a.TeamID != b.TeamID
    AND b.TeamAbbreviation = 'CHE' OR a.TeamAbbreviation = 'CHE'
    AND a.LeagueID = b.LeagueID

当前查询显示以下结果:

这是不正确的,我需要帮助重构结果。我想要实现的是:

  1. 对于球队参加的每场比赛(在本例中为“CHE”),WeekNumber 列需要更新以包含正确的赛程。有多个球队,所以当所有球队打了1周时,它应该显示WeekNumber ‘1’,然后下一轮比赛应该显示WeekNumber ‘2’等等。

  2. 它显示“CHE”与所有球队比赛,而实际上他们应该只与同一联赛的球队比赛(因此 a.LeagueID = b.LeagueID)。在屏幕截图中,它显示了球队与来自其他联赛(其他联赛 ID)的其他球队比赛。

我需要进行哪些更改才能使其正常工作?

期望的输出:

WeekNumber HomeTeamID HomeTeam AwayTeamID AwayTeam HomeLeague Away League
1          4           ARS      19        CHE       1         1
2          14          BRC      19        CHE       1         1
3          15          BRR      19        CHE       1         1

【问题讨论】:

  • 你能显示你想要的输出吗?
  • @Aldrin 包括您提到的所需输出

标签: sql sql-server


【解决方案1】:

最好使用JOIN 而不是CROSS JOIN。但是您的问题是条件周围的括号。

试试这个:

SELECT . . .
FROM dbo.Team a JOIN
     dbo.Team b
     ON a.LeagueID = b.LeagueID AND a.TeamID <> b.TeamID
WHERE b.TeamAbbreviation = 'CHE' OR a.TeamAbbreviation = 'CHE';

你可以将最后一个条件表示为:

WHERE 'CHE' IN (a.TeamAbbreviation, b.TeamAbbreviation);

【讨论】:

  • 酷,唯一的问题是现在希望每轮比赛显示正确数字(查看所需输出)的排名
  • @carlBrooks 。 . .你可能想问另一个问题。 rank() 声明看起来很尴尬。它总是会返回“1”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-07
相关资源
最近更新 更多