2011-02-25 123 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结果='赢'