计算“比率?”为了输赢

时间:2011-05-07 10:03:30

标签: sql

我已经有了这个工作,但这是一个非常糟糕的方法,我需要一些帮助我的查询分解。

SELECT `GameDate`,
   COUNT(CASE
           WHEN `P1Outcome`= 'win' AND  P2Param = 'a' THEN 1 
         END) AS a_win,
   COUNT(CASE
           WHEN `P1Outcome`= 'loss' AND  P2Param = 'a' THEN 1 
         END) AS a_loss,
   COUNT(CASE
           WHEN `P1Outcome`= 'win' AND  P2Param = 'b' THEN 1
         END) AS b_win,
   COUNT(CASE
           WHEN `P1Outcome`= 'loss' AND  P2Param = 'b' THEN 1
         END) AS b_loss
    FROM games 
    WHERE `P2Param` IN ( 'a', 'b', 'c' ) 
    GROUP BY GameDate

这会给我一个查询,我可以在我的php应用程序中使用,但我想跳过必须在PHP中进行实际比率计算并直接用SQL获取它。

所以基本上我一直试图做的是类似的事情:

   COUNT(CASE
           WHEN `P1Outcome`= 'win' AND  P2Param = 'a' THEN 1 Else -1
         END) AS a_ratio,

但就像我的初学者一样,我无法弄明白我是如何让这个工作的。

修改 很抱歉没有更详细地解释我的问候,这是事情。我正在创建一个统计组件,我需要获取一段时间的比率,以便将其显示为图形。因此,需要以下内容:

GameDate(1,2,3,4 ......天前) 基于不同参数的玩家比例(在这种情况下为地图)

所以简而言之,这就是我现在所得到的:

GameDate      a_win      a_loss    b_win      b_loss 
2011/04/25     x          x         x           x
2011/04/23     x          x         x           x
....

所以一切都很好,但我希望在SQL中进行实际的比率计算,因为目前我需要在php中进行,例如$ratio = $q[a_win]-$q[a_loss]并且由于我已经做了很多事实不同的参数我的查询就像是大小的两倍,因为我需要获取胜利和损失,而不仅仅是我想要的比率。

4 个答案:

答案 0 :(得分:2)

SELECT `GameDate`,
   SUM(CASE `P2Param`
         WHEN 'a' THEN CASE P1Outcome WHEN 'win' THEN 1 ELSE -1 END
         ELSE 0
       END) AS a_ratio,
   SUM(CASE `P2Param`
         WHEN 'b' THEN CASE P1Outcome WHEN 'win' THEN 1 ELSE -1 END
         ELSE 0
       END) AS b_ratio
FROM games
WHERE `P2Param` IN ( 'a', 'b', 'c' ) 
GROUP BY GameDate

答案 1 :(得分:1)

非常重要COUNT只返回行数,无论您计算什么,除非您使用COUNT(DISTINCT ...),而SUM(...)会返回不同值的计数。总结为每行生成的一些值,请使用SUM()。确保当NULL函数中的表达式求值为NULL时,DBMS中会发生什么 - 某些数据库只会使整个SUM返回select _date_, (SUM(case when _your_test_ then 1 else 0 end) / count(1)) as ratio from _yout_table_ group by _date_

要获得您可以执行的任何类型数据的比率:

select _date_, SUM(case when _your_test_ then 1 else 0 end) as number_of_something
from _yout_table_
group by _date_

如果您只想计算某些值的总和:

{{1}}

答案 2 :(得分:0)

怎么样:

  SELECT COUNT(id), P1Outcome, P2Param
    FROM games
GROUP BY P2Param, P1Outcome

它将返回一个包含3列的结果集:

  • 计算参数和结果的值
  • 结果
  • PARAM

在我看来,你可以做得更多。

答案 3 :(得分:0)

SELECT GameDate, P2Param, SUM(CASE WHEN P1Outcome = 'win' THEN 1 ELSE -1 END) AS ratio
    FROM games
    GROUP BY GameDate, P2Param