1

この時点まで結果を得るために多くの作業を行ってきましたが、今は立ち往生しています。このようなケースをオンラインで見つけるのは困難でした。

基本的に次のようなテーブルがあります。

Name   |  Results
John   |  Win
John   |  Loss
John   |  Tie
Jim    |  Win
Jim    |  Win

このテーブルはさまざまなゲームから派生したものであるため、各行は基本的にゲームのプレーヤーの結果を表し、各ゲームには 2 人のプレーヤーがいるため、ゲームごとに 2 つの行が必要です。

とにかく、私はこのような結果を得たいと思っており、カウントであらゆる種類の奇妙なことを試しましたが、正しいカウントで個別の名前を取得するのに苦労しています. これが私が望むものです:

NAME   | games_won   |  games_lost   |  games_tied
John   |      1      |       1       |       1
Jim    |      2      |       0       |       0

補足として、最初のテーブルを取得するために思いついた信じられないほど厄介な SQL ステートメントを次に示します。ただし、現在、次のようなゲーム ID も指定しています。

name  |  game_id  | result

あなたが大笑いしたい場合にのみ、ここを読んでください。これを行うためのもっと簡単な方法があると99%確信していますが、ここでの私の質問は、私が以下に書いたことを改善する方法に関するものではないことを覚えておいてください.結果をどうするかだけです:

SELECT name, game_id,
    case
        when p1_score>p2_score then 'win'
        when p1_score<p2_score then 'loss'
        else 'tie'
    end as result
from player 
Inner JOIN game on player.player_id = game.p1_id

union select * from (SELECT name, game_id,
    case
        when p1_score>p2_score then 'win'
        when p1_score<p2_score then 'loss'
        else 'tie'
    end as result
from player 
Inner JOIN game on player.player_id = game.p2_id) as ta
4

1 に答える 1

3
SELECT p.name,
    sum(case when p.player_id = g.p1_id and g.p1_score>g.p2_score
         or p.player_id = g.p2_id and g.p1_score<g.p2_score then 1 else 0 end) games_won,
    sum(case when p.player_id = g.p1_id and g.p1_score<g.p2_score
         or p.player_id = g.p2_id and g.p1_score>g.p2_score then 1 else 0 end) games_lost,
    sum(case when g.p1_score=g.p2_score then 1 else 0 end) games_tied
from player p
inner JOIN game g on p.player_id in (g.p1_id, g.p2_id)
group by p.name
于 2012-12-05T00:49:17.980 に答える