2015-02-07 2 views
0

테이블에있는 각 플레이어 이름에 대해 다음 표에서 플레이어가 얻고 잃은 시간을 선택하려고합니다.두 그룹의 수를 선택하여 그룹화하는 중

이 테이블에는 경기가 진행됩니다.

┌──┬────────┬────────┐ 
│id│winner │loser │ 
├──┼────────┼────────┤ 
│1 │player1 │ player2│ 
├──┼────────┼────────┤ 
│2 │player1 │ player2│ 
├──┼────────┼────────┤ 
│3 │player2 │ player1│ 
├──┼────────┼────────┤ 
│4 │player3 │ player2│ 
└──┴────────┴────────┘ 

예 : 위의 표에서 player1은 2 번의 승리와 1 번의 패배를가집니다. 나는 각 선수가 가지고있는 승리와 손실의 양을 선택하려고 노력하고있다.

내가 현재이 자신의 승리와 함께 각 선수를 반환합니다

SELECT winner, count(winner) FROM multiplayergamestbl GROUP BY winner 

다음과 같은 SQL을 가지고 있지만 손실의 카운트가 내가 기대하고있는 무슨을하지, 손실 계수는 같은 값을 반환합니다 이기는 횟수. 나는 분명히 SQL에 약간 새로운 사람이 나를 도울 수 있습니까?

답변

1

한 가지 방법은 다음과 같이 파생 테이블로 결과를 두 개의 별도의 쿼리 (우승자 카운트 하나와 패자 카운트 하나)과 노동 조합을 수행하고 사용하는 것입니다

select player, max(count_winner), max(count_loser) 
from (

    SELECT winner as player, count(winner) as count_winner, null as count_loser 
    FROM multiplayergamestbl 
    GROUP BY winner 

    union all 

    SELECT loser as player, null as count_winner, count(loser) as count_loser 
    FROM multiplayergamestbl 
    GROUP BY loser 

) t 
group by player; 

외부 쿼리는 최대 집계 함수를 사용하여 행을 병합하지 않고 3 행 대신 5 행을 얻습니다 (this example 참조).

Sample SQL Fiddle

+1

이 절대적으로 완벽한, 여분의 설명에 감사 SQL 바이올린도. – Stella

0

원하는 모양과 비슷할 수 있습니다. 이 작업을 수행하는

select 'winner' category 
, winner 
, count(*) records 
from multiplayergamestbl 
group by 'winner', winner 

union 

select 'loser' category 
, loser 
, count(*) records 
from multiplayergamestbl 
1

먼저이 하위 쿼리를 사용하여에 있어야 형식 같은 더으로 테이블을 설정, 그 이상 단순한 합을 수행

select player, sum(won) won, sum(lost) lost from (
    select winner player, 1 won, 0 lost from multiplayergamestbl 
    union select loser, 0, 1 from multiplayergamestbl) x 
group by player 
+0

좋은 해결책. +1 – jpw

관련 문제