1

私のスポーツ関連プロジェクトの 1 つで、チームの記録数を表示する必要があります。

例: 「チーム 1」と「チーム 2」は 5 試合を行いました。「チーム 1」は 3 回、「チーム 2」は 2 回優勝しています。したがって、出力は (3-2) になるはずです。

これは、いくつかのデータを含むテーブル構造です。

ID ---- TEAM1 ---- SCORE1 ---- TEAM2 ---- SCORE2
1       70         1           73         2
2       74         0           70         1
3       74         2           73         1
4       73         1           70         0

出力は次のようになります。

TEAM1 ---- TEAM2---- RECORD
70         73         2-0
74         70         0-1
74         73         1-0

ノート:

  • 常に勝者があり、引き分けになることはありません。
  • 出力では、team1 と team2 の組み合わせは一意である必要があります。

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

4

1 に答える 1

2

ここで難しいのは、ホームとアウェイで同じチームが対戦することです。これは、(多くの) case ステートメントで回避できます。

基本的なアプローチは、ID が最も小さいチームが最初に表示されるようにデータを再フォーマットすることです。

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
  games
group by
   least(homeTeam, awayTeam),
   greatest(homeTeam, awayTeam);

SQL Fiddle

またはもう少しコンパクトですが、理解するのが難しいかもしれません:

select 
   least(homeTeam, awayTeam) team1,
   greatest(homeTeam, awayTeam) team2,
   sum(case sign(awayTeam - homeTeam) 
       when sign(homeTeamScore - awayTeamScore) then 1
       else 0 end) team1Wins,
   sum(case sign(awayTeam - homeTeam) 
       when sign(awayTeamScore - homeTeamScore) then 1
       else 0 end) team2Wins
from
  games
group by
   least(homeTeam, awayTeam),
   greatest(homeTeam, awayTeam);

SQL Fiddle

于 2013-10-13T16:10:42.853 に答える