我已经有了这个工作,但这是一个非常糟糕的方法,我需要一些帮助我的查询分解。
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]
并且由于我已经做了很多事实不同的参数我的查询就像是大小的两倍,因为我需要获取胜利和损失,而不仅仅是我想要的比率。
答案 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列的结果集:
在我看来,你可以做得更多。
答案 3 :(得分:0)
SELECT GameDate, P2Param, SUM(CASE WHEN P1Outcome = 'win' THEN 1 ELSE -1 END) AS ratio
FROM games
GROUP BY GameDate, P2Param