假设我有一个包含以下字段的GAME表
user_id,result
我希望计算胜利百分比,定义为记录总数
result = 'Win'
与记录总数相比
result <> ''
我如何在sql中执行此操作并以最高赢率百分比的顺序返回结果?
解决方法
大多数数据库系统应该能够使用类似于以下内容的方式来处理:
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
顺便说一下,我假设您打算说胜利百分比是总比赛数中的胜利总数.如果你真的意味着结果<> ”,然后你需要像这样修改查询:
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