2014-01-27 2 views
2

У меня есть таблица, подобная этой в базе данных SQLLite. Name1 - это имя игрока 1 (то же самое для name2), а winner представляет, какой игрок выиграл (первая строка, выигравший JOE).Подсчет значений с несколькими значениями

Я хотел бы получить все имена противников для конкретного игрока, количество побед, в которых игрок выиграл у этого игрока, и сколько раз они играли.

Ex. выход для JOE:

 
name wins games 
---------------------- 
BILL 1  2  (JOE played againts BILL 2 times and JOE won 1) 
NICK 2  2 
GREG 1  3  (JOE played againts GREG 3 times and JOE won 1) 

Это то, что я до сих пор, но это только выводит имена всех игроков:

SELECT name2 FROM games WHERE name1="JOE" 
UNION 
SELECT name11 FROM games WHERE name2="JOE" 

данных в таблице games:

 
id name1  name2  winner 
---------------------------------------- 
1 JOE   BILL  1 
2 BILL   JOE  1 
3 NICK   JOE  2 
4 JOE   NICK  1 
5 NICK   BILL  1 
6 GREG   JOE  1 
7 GREG   JOE  2 
8 GREG   JOE  1 

ответ

4

Здесь представляет собой подход с агрегацией и операторы case. Вычисление победителя для каждой игры немного сложно, потому что победитель ссылается либо на столбец , либо name2. Вы, кажется, хотят победы для противника, так что эта логика убеждается, что winner не относится к JOE:

select (case when name1 = 'JOE' then name2 else name1 end) as name, 
     sum(case when name1 = 'JOE' and winner = 2 then 1 
       when name2 = 'JOE' and winner = 1 then 1 
       else 0 
      end) as wins, 
     count(*) as games 
from games g 
where 'JOE' in (name1, name2) 
group by (case when name1 = 'JOE' then name2 else name1 end); 
+0

Спасибо, это работает. Я хотел побед для «JOE», а не для соперника, но ваш код легко менялся. – domen

Смежные вопросы