2012-12-05 79 views
1

我已經做了很多的工作讓我的結果這一點,現在我卡住了。我很難在網上找到這樣的案例。計數結果列連接具有鮮明的ID SQL

我有一個表,基本上是這樣的:

Name | Results 
John | Win 
John | Loss 
John | Tie 
Jim | Win 
Jim | Win 

此表由不同的遊戲得來,所以各行基本上是代表一個球員導致了比賽,應該有,因爲每場比賽每場比賽兩行有2名球員。

不管怎樣,我希望得到一些結果是這樣,我已經試過各種怪異的東西帶計數的,但我有一個很難得到一個明確的名稱與正確的計數。這是我想什麼:

NAME | games_won | games_lost | games_tied 
John |  1  |  1  |  1 
Jim |  2  |  0  |  0 

而作爲一個側面說明,這裏是令人難以置信的凌亂的SQL語句,我拿出來獲得的第一個表,但我現在有這也給遊戲ID喜歡這樣的:

name | game_id | result 

只有你了一個很好笑讀這裏,我99%肯定有一個更簡單的方法來做到這一點,但只記得我的問題在這裏不是如何以提高我已經寫在下面,它只是如何處理結果做:

SELECT name, game_id, 
    case 
     when p1_score>p2_score then 'win' 
     when p1_score<p2_score then 'loss' 
     else 'tie' 
    end as result 
from player 
Inner JOIN game on player.player_id = game.p1_id 

union select * from (SELECT name, game_id, 
    case 
     when p1_score>p2_score then 'win' 
     when p1_score<p2_score then 'loss' 
     else 'tie' 
    end as result 
from player 
Inner JOIN game on player.player_id = game.p2_id) as ta 
+0

你們是不是要輸出這個像訪問或網站上的程序?從你的結構來看,我傾向於訪問查詢。 –

+0

@MichaelGarrison我使用這些結果基本上在C#中構建一個html表。 – mrfreester

+0

我不知道正確的C#語法,但我可以給你做什麼,我認爲總體思路。 –

回答

3
SELECT p.name, 
    sum(case when p.player_id = g.p1_id and g.p1_score>g.p2_score 
     or p.player_id = g.p2_id and g.p1_score<g.p2_score then 1 else 0 end) games_won, 
    sum(case when p.player_id = g.p1_id and g.p1_score<g.p2_score 
     or p.player_id = g.p2_id and g.p1_score>g.p2_score then 1 else 0 end) games_lost, 
    sum(case when g.p1_score=g.p2_score then 1 else 0 end) games_tied 
from player p 
inner JOIN game g on p.player_id in (g.p1_id, g.p2_id) 
group by p.name 
+0

這看起來像我希望和更多的東西,讓我給它一個鏡頭 – mrfreester

+0

感謝給一個偉大的答案,以及簡化我的SQL。這個簡單的p.player_id(g.p1_id,g.p2_id)將成爲一個拯救我的項目的救星。我不知道你可以這樣做。你的解決方案效果很好 – mrfreester