如何计算SQL中的比率?

时间:2011-02-25 06:43:23

标签: sql

假设我有一个GAME表,其中包含以下字段

user_id, result

我希望计算胜利百分比,定义为

的记录总数
result = 'Win'

的记录总数相比
result <> ''

如何在SQL中执行此操作并以最高胜率百分比的顺序返回结果?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

在MySQL中,您可以使用以下快捷方式:

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

假设Result永远不为NULL(空字符串没问题)。否则你必须使用 结果不是NULL并且Result ='Win'