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

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 に答える
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 に答える