2010-01-03 97 views
1

首先,我知道這是一個非常模糊的標題 - 我對SQL的知識太弱,以至於我不太瞭解我所要求的具體內容,所以請耐心等待。SELECT語句的幫助

我有一個表,看起來像這樣:

+--------+-----------+----------+--------+--------+ 
| gameid | team1  | team2 | score1 | score2 | 
+--------+-----------+----------+--------+--------+ 
|  1 | New York | Boston |  1 |  2 | 
|  2 | New York | Boston |  2 |  0 | 
|  3 | Baltimore | New York |  3 |  1 | 
|  4 | Boston | New York |  3 |  0 | 
+--------+-----------+----------+--------+--------+ 

凡遊戲ID是一個唯一的標識符,score1對應分數TEAM1等

我需要的是,這將產生一個查詢給定球隊對所有對手的勝負總和。以紐約爲例,查詢將創建下表:

+-----------+------+--------+ 
| team  | wins | losses | 
+-----------+------+--------+ 
| Baltimore | 0 |  1 | 
| Boston | 1 |  2 | 
+-----------+------+--------+ 

回答

2

我沒有訪問SQL框現在(所以這可能是語法弱)和我不是一個巨大的風扇的db結構,但這應該讓你去:

SELECT team, SUM(win) AS wins, SUM(loss) AS losses 
FROM 
(SELECT team1 AS team, 
    CASE WHEN score1>score2 THEN 1 END AS win, 
    CASE WHEN score2>score1 THEN 1 END AS loss 
    FROM YourTable 
    UNION ALL 
    SELECT team2 AS team, 
    CASE WHEN score2>score1 THEN 1 END AS win, 
    CASE WHEN score1>score2 THEN 1 END AS loss 
    FROM YourTable) 
GROUP BY team 

此外,這忽略了關係。

注:我做了這個CW - 請更新,如果你能改善它

+0

你的閉幕paren是在錯誤的地方。我很驚訝,我們提出了完全相同的解決方案! – 2010-01-03 22:36:34

+0

@保羅:明白了,謝謝! – 2010-01-03 22:37:01

1

這是可能的,但查詢走出來,是非常複雜的。如果可能的話,也許你可以重新組織你的模式以將更多的信息編碼到它中。例如,您可以使用winning_teamlosing_team而不是team1team2;類似地,使用winning_scorelosing_score您不必檢查哪個分數與哪個團隊相對應。然後,您可以在losing_team上執行GROUP BY以獲得特定團隊對所有其他團隊的所有勝利,並在winning_team上獲得所有勝利以獲得損失(並避免在此特定查詢中使用得分)。

+0

同意。更好地表示「遊戲」或贏/輸記錄的東西(例如,每場比賽每隊1排)會使這更容易 – 2010-01-03 22:32:08

+0

所以我的觀點是我的表結構是廢話,明白了。就像我所說的,數據庫管理並不是我的事情,這對我來說是一個學習練習。但是我有幾張非常大的桌子 - 擁有一個「遊戲」桌派生的「結果」表是否合理? @邁克爾哈倫 - 基本上是我現在桌子大小的兩倍? – 2010-01-03 22:37:05

+0

我們在說幾個遊戲(100 1000 10000 ...)?從某種意義上來說,這與複式記賬保持一致 - 一個隊要贏,另一個必須輸。您可以將所有這些記錄爲分類帳樣式的交易記錄 – 2010-01-03 22:43:49

1

同上改爲@大衛的意見,這將是霧氣更容易,如果你的表結構更加normailized,但是,隨着它是架構,試試這個SQL

Select T.Team, 
    Sum(Case When S1.Score1 > S1.Score2 Or 
        S2.Score2 > S2.Score1 Then 1 Else 0 End) Wins, 
    Sum(Case When S1.Score1 < S1.Score2 Or 
        S2.Score2 < S2.Score1 Then 1 Else 0 End Losses, 
    Sum(Case When S1.Score1 = S1.Score2 Or 
        S2.Score2 = S2.Score1 Then 1 Else 0 End Ties  
    (Select Distinct team1 team from Table 
    Union Select Distinct team2 team from Table) T 
     Left Join Table S1 
     On S1.Team1 = T.Team 
     Left Join Table S2 
     On S2.Team2 = T.Team 
    Group By T.Team 
0

試試這個..

SELECT 
    team 
    ,sum(wins) as wins 
    ,sum(losses) as losses 
FROM 
    (
    SELECT 
     team1 as team 
     ,SUM(CASE WHEN score1 > score2 THEN 1 ELSE 0 END) as wins 
     ,SUM(CASE WHEN score1 < score2 THEN 1 ELSE 0 END) as losses 
    FROM 
     myTable 
    GROUP BY 
     team1 
    UNION ALL 
    SELECT 
     team2 as team 
     ,SUM(CASE WHEN score2 > score1 THEN 1 ELSE 0 END) as wins 
     ,SUM(CASE WHEN score2 < score1 THEN 1 ELSE 0 END) as losses 
    FROM 
     myTable 
    GROUP BY 
     team2 
    ) a 
GROUP BY 
team