4

我一直在研究 SQLzoo 问题,但在 JOIN 教程问题 #13 中的最后一个问题 - 列出每场比赛以及每支球队的进球数,如图所示。

链接:http ://sqlzoo.net/wiki/The_JOIN_operation

在他们提供的示例代码中,它使用了一个案例。我这样修改它:

SELECT game.mdate, game.team1,
  CASE WHEN goal.teamid=game.team1 THEN 1 ELSE 0 END score1, game.team2,
  CASE WHEN goal.teamid=game.team2 THEN 1 ELSE 0 END score2
  FROM game, goal WHERE game.id=goal.matchid
GROUP BY game.mdate, goal.matchid, game.team1, game.team2

他们建议在 score1/score2 上使用 SUM 函数将提供答案。我对如何在 SQL 中创建的这 2 列上使用 SUM 函数感到困惑。

任何人都可以提供有关如何做的提示,或从广义上提及如何以更好的方式编写此 SQL 查询吗?

4

4 回答 4

14

这对我来说适用于左连接的更正。

SELECT mdate, team1,
SUM(CASE WHEN teamid = team1 THEN 1 ELSE 0 END) score1,
team2,
SUM(CASE WHEN teamid = team2 THEN 1 ELSE 0 END) score2
FROM game LEFT JOIN goal ON matchid = id GROUP BY mdate, matchid, team1, team2
于 2014-01-24T22:23:15.737 回答
4

好吧,你确实需要SUM那些列(SUM是一个聚合函数,这就是你在GROUP BY那里的原因)。至于以更好的方式编写查询,您需要放弃旧的隐式JOIN样式并使用 ANSI 显式样式:

SELECT  game.mdate, 
        game.team1,
        SUM(CASE WHEN goal.teamid=game.team1 THEN 1 ELSE 0 END) score1, 
        game.team2,
        SUM(CASE WHEN goal.teamid=game.team2 THEN 1 ELSE 0 END) score2
FROM game
INNER JOIN goal 
    ON game.id=goal.matchid
GROUP BY game.mdate, goal.matchid, game.team1, game.team2
于 2013-03-15T18:49:02.897 回答
4

你的 SQL 很好,你只需要一个SUM聚合函数的好例子。
这是我的解决方案:

 SELECT mdate,
 team1, SUM(CASE game.team1 WHEN goal.teamid THEN 1 ELSE 0 END) 'score1',
 team2, SUM(CASE game.team2 WHEN goal.teamid THEN 1 ELSE 0 END) 'score2'
 FROM game LEFT JOIN goal ON game.id=goal.matchid
 GROUP BY game.id
 ORDER BY mdate, matchid, team1, team2

注意:我原来的帖子给出了不正确的值,需要使用LEFT JOIN而不是INNER JOIN. 左连接处理两支球队得分为 0 的情况,内连接不处理这些情况。

于 2013-03-15T19:13:03.777 回答
2

我认为 SQLzoo 问题已更新,上述答案似乎并未完全解决问题 #13。ORDER BY请注意,现在需要排序子句。

SELECT
        mdate,
        team1,
        SUM(CASE                  
            WHEN teamid=team1 THEN 1                              
            ELSE 0              
        END) as 'score1',
        team2,
        SUM(CASE                  
            WHEN teamid=team2 THEN 1                  
            ELSE 0              
        END) as 'score2'             
    FROM
        game          
    LEFT JOIN
        goal                  
            ON (
                goal.matchid = game.id                 
            )          
    GROUP BY
        mdate,
        team1,
        team2          
    ORDER BY
        mdate,
        matchid,
        team1,
        team2     ;
于 2020-10-29T15:58:55.360 回答