0

私はあなたの助けが必要です:

ユーザー、ゲーム、結果用に設定された一連のリレーショナル テーブルがあり、各ユーザーの勝率を計算しようとしています。

多くのブラウジングのおかげで、次の方法を発見しました。

SELECT Winner, (COUNT(Winner) * games.TotalPlayed) AS PercentWon
FROM Results
JOIN (
  SELECT 100/COUNT(*) AS TotalPlayed
  FROM games
  where Player_1 = 'John' OR Player_2 = 'John'
) AS games

where Winner == 'John' 
GROUP BY Winner
ORDER BY PercentWon DESC;

これは Johns % を取得するのに完全に機能しますが、結果テーブル全体をスキャンして全員の値を出力したいと考えています。ただし、次の使用は許可されていません。

SELECT Winner, (COUNT(Winner) * games.TotalPlayed) AS PercentWon
FROM Results
JOIN (
  SELECT 100/COUNT(*) AS TotalPlayed
  FROM games
  where Player_1 = Winner OR Player_2 = Winner
) AS games

where Winner != 'Draw' 
GROUP BY Winner
ORDER BY PercentWon DESC;

勝者が定義されていないため。実行中にサブクエリに渡される Winner の値を取得するにはどうすればよいですか?

4

1 に答える 1

0

私はついにあなたのために働く何かを思いついた. gamesプレーヤーはテーブルの 2 つのフィールドのいずれかにいる可能性があるため、注意が必要でした。

SELECT player, (COALESCE(totalWon, 0) / count(*) * 100) as PercentWon
FROM ((SELECT DISTINCT Player_1 as player FROM games) UNION (SELECT DISTINCT Player_2 as player FROM games)) players
INNER JOIN games on (games.Player_1 = player or games.Player_2=player)
LEFT JOIN
(
    SELECT Winner, COUNT(Winner) as totalWon
    FROM Results
    WHERE Winner != 'Draw' 
    GROUP BY Winner
) as winners
ON winners.Winner = player
GROUP BY player
ORDER BY PercentWon DESC;

FROM 句の UNION は、ゲームへの参加 (プレーヤーごとの合計ゲーム数を見つけるため) と勝者 (プレーヤーごとの勝利数を見つけるため) に使用できるユーザー リストを作成します。

COALESCE は、プレーヤーがゲームに勝っていない場合に使用されます。テーブルを結合しているため、一致がない場合は NULL の代わりに 0 をデフォルトに設定できます。

これは、スキーマに関する私の仮定に基づく sqlfiddle です。

http://sqlfiddle.com/#!2/d762c/1/0

于 2013-04-03T14:56:08.827 に答える