2011-02-25 141 views
3

假設我有一個GAME表具有以下字段如何計算SQL中的比率?

user_id, result 

我希望計算定義爲記錄總數的勝率,其中

result = 'Win' 

相比總記錄數,其中

result <> '' 

我該如何在SQL中做到這一點,並將結果以最高勝率先返回?

回答

12

大多數數據庫系統應該能夠以一個類似於處理這個問題:

Select user_id 
    , Sum(Case When Result = 'Win' Then 1 Else 0 End)/Count(*) * 1.0 As WinPercent 
From Game 
Group By user_id 
Order By WinPercent Desc 

順便說一句,我假設你的意思是說的勝率是勝總數出總數的遊戲。如果你真的沒有意思where result <> '',那麼你就需要修改查詢,像這樣:

Select user_id 
    , Sum(Case When Result = 'Win' Then 1 Else 0 End) 
     /Sum(Case When Result <> '' Then 1 Else 0 End) * 1.0 As WinPercent 
From Game 
Group By user_id 
Order By WinPercent Desc 

加成

有人在評論這是SQL Server的具體建議。不是這樣。上述解決方案中的所有內容都是SQL標準的一部分。一個給定的數據庫系統是否實現了所有需要的功能顯然是另一回事。因此,如果我們正在切換尋找一種在大多數數據庫系統上可以正常工作的解決方案,那麼支持度差異最大的一項功能可能就是使用Order By中的列別名。可以實現相當於在一對夫婦的方式,但會在大多數數據庫系統工作的一種方式是使用派生表:

Select Z.user_id, Z.WinPercent 
From (
     Select user_id 
      , Sum(Case When Result = 'Win' Then 1 Else 0 End) 
       /Sum(Case When Result <> '' Then 1 Else 0 End) * 1.0 As WinPercent 
     From Game 
     Group By user_id 
     ) As Z 
Order By Z.WinPercent Desc 
+0

看起來不錯,但是是特定於sql服務器。 – 2011-02-25 08:39:08

+0

@Stefan Steinegger - 你如何看待這是SQL Server特有的? – Thomas 2011-02-25 16:42:18

+0

我以爲'Case When'不是標準的SQL。但你是對的,這是ansi sql。我只知道它來自sql server,oracle曾經有過這個解碼功能。 – 2011-02-28 09:13:35

1

在MySQL中,你可以使用這個快捷鍵:

SELECT user_id, avg(Result = 'Win') AS WinPercent 
FROM Game 
GROUP BY user_id 
ORDER BY WinPercent DESC 

假設結果從不爲NULL(空字符串可以)。否則,你必須使用 結果IS NOT NULL AND結果='贏'