Sunny的Collusion Team需要BO提供相关的作弊检查信息。基本上就是基于一个可疑的玩家,其它玩家与它对局的相关数据:两人一共一起玩了多少局,一起玩时的胜率,一起玩时的收入等数据。她所希望得到的数据如下图所示:
这样的需求如果用BO在数据库来做的话,需要递归地做很多查询,性能很不理想。之前我们有试验性的做过尝试,查询的速度很慢。这样我希望通过把 Game History里的数据eport成EXCEL文件的方式,在EXCEL中使用公式来计算(统计)出相应的数据。其实分析这个报表,Sunny想要的数据都是从基础数据中运算或者统计得出来的。而这个基础数据,就是Game History中的数据。
经过一段时间的尝试,这个template做好了,"PlayertoPlayer"这个sheet是结果试问页,"Raw0"是基础数据页,从 Game History报表里Export出来的数据就粘贴到这里;"Raw1"到"Raw5"是复制数据页,它们从"Raw0"页中复制出的数据,同时针对 A53到A56的这四位玩家,分别统计出相应的数据,最后再在"PlayertoPlayer"这个sheet上做汇总。
好了,有了上面的说明,相信这个报表的需求已经基本清楚了。
现在来说一下这个报表上用到的一个EXCEL函数: SUMIF():
如上图所示,对于Combined Income的计算是通过SUMIF函数来实现的。SUMIF函数的语法是:SUMIF( range, criteria, sum_range )。
SUMIF函数的参数说明如下:
第一个参数:range为条件区域,用于条件判断的单元格区域。
第二个参数:criteria是求和条件,由数字、逻辑表达式等组成的判定条件。
第三个参数:sum_range为实际求和区域,也就是需要求和的单元格、区域或引用。
当省略第三个参数的时候,条件区域就是实际求和区域,也就是说条件区域与求和区域是一致的。
criteria参数中可以使用通配符(包括问号(?) 和星号 (*))。问号匹配任意单个字符;星号匹配任意一串字符。如果要查找实际的问号或星号字符,请在该字符前输入波形符(~)。
上面例图中的公式实际上统计sheet Raw1上符合Q这一列的值为1的行中Y这一列对应的值的和。sheet RAW1的数据如下图所示:
可以看得出,Q这一列代表玩家B有没有参加过本行中的游戏;Y这列代表玩家B在本行的游戏中的输赢分。
心得:EXCEL中的SUMIF函数相当于SQL中的SELECT语句带SUM函数的用法:
SELECT SUM(sum_range) from Sheet
WHERE range = criteria;
其中Sheet代表EXCEL中的datasheet;range, criteria和sum_range分别代表SUMIF函数中的第一个,第二个和第三个参数。