0

ゲームのリストを含むテーブルがあり、チーム ID とゲームのスコアが含まれています。

これがテーブル構造です。

ID  HOMETEAM    HOMETEAMSCORE   AWAYTEAM    AWAYTEAMSCORE
  • ゲームの各チームのスコアは、それぞれの列に表示されます。
  • ゲームが開始されていない場合、スコアは両方のチームで 0 になります。
  • ゲームが終了すると、0-0 のスコアを持つゲームはありません。

特定の 2 チームの戦績を取得する必要があります。たとえば、チーム 1 と 2 の場合、出力を 1-3 にする必要があります。これは、チーム 1 がチーム 2 に対して 1 回勝利し、チーム 2 がチーム 1 に対して 3 回勝利したことを意味します。

以下のSQLを使用していますが、ある程度機能します。しかし、まだ開始されていないゲーム (0-0 のスコア) の出力を 0-0 として取得する必要があります。

SELECT least(homeTeam, awayTeam) team1,
       greatest(homeTeam, awayTeam) team2,
       sum(case when awayTeam > homeTeam
          then case when homeTeamScore > awayTeamScore then 1 else 0 end else case when homeTeamScore > awayTeamScore then 0 else 1 end
       end) team1Wins,
       sum(case when hometeam > awayteam
          then case when homeTeamScore > awayTeamScore then 1 else 0 end else case when homeTeamScore > awayTeamScore then 0 else 1 end
       end) team2Wins
FROM ow_sports_games 
GROUP BY least(homeTeam, awayTeam),
         greatest(homeTeam, awayTeam)

また、これ以外に SQL を改善するより良い方法はありますか?

SQL フィドル: http://sqlfiddle.com/#!2/10326/4/1

編集:

私の要件をより詳細に説明するためのいくつかのサンプルデータ:

HOMETEAM    HOMETEAMSCORE   AWAYTEAM    AWAYTEAMSCORE
18          1               22              0
22          2               18              1
18          3               22              2
12          0               13              0

チーム 18、22 の場合、チーム 18 が 2 勝、チーム 22 が 1 勝であるため、出力は 2-1 になるはずです。

チーム 12 と 13 の場合、ゲームが終了していないため、出力は 0-0 になります。

全体的なシナリオを説明する OUTPUT サンプル:

HomeTeam      AwayTeam     Records
18             22          2-1
22             18          1-2
12             13          0-0
4

1 に答える 1

1

これは、問題ステートメントの出力と一致します (最初の 3 列は同じです。次の 2 列は並べ替え用であり、再生されていないが記録があった場合を考慮に入れていることを確認します。http://sqlfiddle.com/を参照してください)。 #!2/10326/43

SELECT DISTINCT hometeam, awayteam
    , CONCAT(IF(hometeam = LEAST(hometeam, awayteam),team1wins, team2wins),' - ', IF(awayteam = LEAST(hometeam, awayteam),team1wins, team2wins)) AS Head2HeadRecord
    , CONCAT(LEAST(hometeam, awayteam), GREATEST(hometeam, awayteam)) AS surrogateSort
    , notplayed
FROM ow_sports_games 
JOIN (SELECT LEAST(hometeam, awayteam) AS team1
       ,GREATEST(hometeam, awayteam) AS team2
       ,SUM(IF(LEAST(hometeam, awayteam) = hometeam AND homeTeamScore > awayTeamScore, 1,
                IF(LEAST(hometeam, awayteam) = awayteam AND awayTeamScore > homeTeamScore,1,0) 
              )
            ) AS team1Wins
      ,SUM(IF(GREATEST(hometeam, awayteam) = hometeam AND homeTeamScore > awayTeamScore, 1,
                IF(GREATEST(hometeam, awayteam) = awayteam AND awayTeamScore > homeTeamScore,1,0) 
              )
            ) AS team2Wins  
       ,SUM(IF(homeTeamScore=0 AND awayTeamScore=0,1,0)) AS notPlayed
      FROM ow_sports_games 
      GROUP BY team1, team2) AS trecords
  ON LEAST(hometeam, awayteam) = team1
    AND GREATEST(hometeam, awayteam) = team2
ORDER BY surrogateSort, hometeam,awayteam;
于 2013-11-02T19:55:53.323 に答える