0

これは少し複雑なクエリですが、私はスヌーカーの試合のデータベースを持っており、誰がプレーして最も決定的なフレームを獲得したかに関する統計を生成しようとしています (ゲームを知らなくても、ルールについて心配する必要はありません) )。

テーブル:

ID player1  player2   bestOf     player1Score      player2Score
1   1           2          9          5                   0
2   2           1          9          5                   4
3   1           2          9          5                   4
4   2           1          9          4                   5

私がやろうとしているのは、次のようなものです。

SELECT COUNT(*) AS played, DISTINCT(player1,player2) AS playerID 
FROM matches 
WHERE (player1Score=BestOf / 2 + 0.5 AND player2Score=BestOf / 2 - 0.5) 
GROUP BY playerID

DISTINCT は複数の列をサポートしていないと思われるため、上記のクエリは機能しません。一番上のテーブルから探している結果は次のとおりです。

playerID played  won
1           3      2
2           3      1

表の一番上の行は最終フレームではないため表示されません。

次のようなバリエーションを試しました。

SELECT GROUP(player1,player2)
SELECT player1 + player2 AS playerID, select DISTINCT(playerID)
SELECT (player1 + player2) AS playerID GROUP BY playerID

他にもいくつかあります。ヒントをいただければ幸いです。

4

2 に答える 2

0

私は実際にあなたのテーブルを持っていないので、私のSQLにはおそらく多くの構文エラーがあります. しかし、うまくいけば、私は一般的な考えを理解できるようになるでしょう. プレーヤー 1 が勝った決定フレーム ゲームのリストを計算し、それをプレーヤー 2 が勝った決定フレーム ゲームのリストと結合できます。勝者の列名を同じ文字列 ('player') に変更する限り、これらのテーブルを結合すると、各人の勝った回数を示す 1 つのテーブルが生成されます。

select player, count(*) as num_won from ((select player1 as player from matches where player1Score - player2Score = 1) union (select player2 as player from matches where player2Score - player1Score = 1));

これにより、各プレイヤーの ID から勝った回数へのマッピングが得られます。

次に検討する

select player, count(*) as num_played from ((select player1 as player from matches where abs(player1Score - player2Score) = 1) union (select player2 as player from matches where abs(player2Score - player1Score) = 1));

関数 abs を使用すると、各プレイヤーがプレイした決定的なフレーム ゲームの数を知ることができます。これら 2 つの表を組み合わせて、最終的な答えを取得します。

select players_table.player, players_table.num_played, winners_table.num_won from (select player, count(*) as num_won from ((select player1 as player from matches where player1Score - player2Score = 1) union (select player2 as player from matches where player2Score - player1Score = 1)) winners_table), (select player, count(*) as num_played from ((select player1 as player from matches where abs(player1Score - player2Score) = 1) union (select player2 as player from matches where abs(player2Score - player1Score) = 1)) players_table) where winners_table.player == players_table.player;
于 2012-04-26T07:44:43.150 に答える
0
create table temp_score
select playerid, count(*) as won 
FROM(
  Select   case  when player1score > player2score then  player1 else player2 end as playerid
    from score
    where
    (player2Score=Round(BestOf / 2 + 0.5,0) AND player1Score=round(BestOf / 2 - 0.5,0))
    or
    (player1Score=Round(BestOf / 2 + 0.5,0) AND player2Score=round(BestOf / 2 - 0.5,0))
) a
group by playerid

Select playerid,won, (Select SUM(won) from temp_score)  as TotalPlayed  from temp_score
于 2012-04-26T09:06:41.020 に答える