テーブルのレコードには各ユーザの試合ごとの結果が入っています。
サブクエリで勝ち負けそれぞれを集計しようとしたところで行き詰りました。
*postgreSQLを使用
TABLE
userID|result |
---------------------|
1 |win |
---------------------|
1 |win |
---------------------|
2 |win |
---------------------|
1 |lose |
---------------------|
3 |lose |
---------------------|
3 |win |
---------------------|
1 |lose |
---------------------|
5 |lose |
こんな感じのランキング(勝率順)
userID|勝率
------
2 |…%
------
1 |…%
------
3 |…%
------
5 |…%
こちらでいかがでしょうか?
テーブル名を「テーブル1」としています。
SELECT * FROM ( SELECT userID, (winCountSum / (loseCountSum + winCountSum) * 100) AS winRatio FROM ( SELECT userID, SUM(winCount) AS winCountSum, SUM(loseCount) AS loseCountSum FROM ( SELECT userID, 1 AS winCount, 0 AS loseCount FROM テーブル1 WHERE result ="win" UNION ALL SELECT userID, 0 AS winCount, 1 AS loseCount FROM テーブル1 WHERE result ="lose" ) TBL GROUP BY userID ) TBL2 ) ORDER BY winRatio DESC, userID
こちらでいかがでしょうか?
テーブル名を「テーブル1」としています。
SELECT * FROM ( SELECT userID, (winCountSum / (loseCountSum + winCountSum) * 100) AS winRatio FROM ( SELECT userID, SUM(winCount) AS winCountSum, SUM(loseCount) AS loseCountSum FROM ( SELECT userID, 1 AS winCount, 0 AS loseCount FROM テーブル1 WHERE result ="win" UNION ALL SELECT userID, 0 AS winCount, 1 AS loseCount FROM テーブル1 WHERE result ="lose" ) TBL GROUP BY userID ) TBL2 ) ORDER BY winRatio DESC, userID
勝率の計算がどうしてもゼロになるのでwinCountSum / (loseCountSum + winCountSum) * 100)→(winCountSum * 100 / (loseCountSum + winCountSum))にしたらできました。
後、一番上のSELECT文にTBL3という名前をつけたら無事動きました。
ありがとうございました。
-- テスト用一時テーブル作成 CREATE TEMP TABLE T1 ( userID integer, result varchar(4) ); INSERT INTO T1 VALUES (1, 'win'); INSERT INTO T1 VALUES (1, 'win'); INSERT INTO T1 VALUES (2, 'win'); INSERT INTO T1 VALUES (1, 'lose'); INSERT INTO T1 VALUES (3, 'lose'); INSERT INTO T1 VALUES (1, 'win'); INSERT INTO T1 VALUES (1, 'lose'); INSERT INTO T1 VALUES (5, 'lose'); -- 率計算 SELECT userID, sum(CASE result WHEN 'win' THEN 1 ELSE 0 END) * 100 / count(*) AS % FROM T1 GROUP BY userID ORDER BY % DESC ;
当方では全角の%もフィールド名として利用できておりますが、
そちらの環境に合わせて適宜変更してください。
正常稼働試験済です。
--テーブル作成 CREATE TABLE `Table1` ( `userID` int(11) default NULL, `result` text ); --レコード追加 INSERT INTO `Table1` VALUES (1, 'win'), (1, 'win'), (2, 'win'), (1, 'lose'), (3, 'lose'), (3, 'win'), (1, 'lose'), (5, 'lose'); --回答のSQL SELECT `userID`, (`Win`/(`Win`+`Lose`)*100) AS `WinRatio` FROM ( SELECT `userID`, SUM(CASE WHEN `result`='win' THEN 1 ELSE 0 END) AS `Win`, SUM(CASE WHEN `result`='lose' THEN 1 ELSE 0 END) AS `Lose` FROM `Table1` GROUP BY `userID` ) `SumTable1` ORDER BY `WinRatio` DESC;
回答者 | 回答 | 受取 | ベストアンサー | 回答時間 | |
---|---|---|---|---|---|
1 | ![]() |
2915回 | 2772回 | 301回 | 2009-06-26 19:34:38 |
勝率の計算がどうしてもゼロになるのでwinCountSum / (loseCountSum + winCountSum) * 100)→(winCountSum * 100 / (loseCountSum + winCountSum))にしたらできました。
後、一番上のSELECT文にTBL3という名前をつけたら無事動きました。
ありがとうございました。