A | B | C | D | |
1 | 城市 | 学员姓名 | 课程 | 分数 |
2 | 上海 | 潘华生 | 静电 | 90 |
3 | 北京 | 蔡道兴 | 静电 | 85 |
4 | 杭州 | 苏燕康 | 色彩 | 85 |
5 | 南宁 | 陈文俊 | 数码 | 77 |
6 | 武汉 | 陆衡 | 数码 | 82 |
7 | 广州 | 袁彪 | 色彩 | 88 |
8 | 杭州 | 曾丹斌 | 静电 | 95 |
9 | 上海 | 廖旭华 | 色彩 | 90 |
10 | 上海 | 廖旭华 | 静电 | 70 |
11 | 北京 | 潘浩峰 | 静电 | 55 |
12 | 昆明 | 赵建庆 | 静电 | 82 |
13 | 北京 | 赵永胜 | 色彩 | 45 |
14 | 成都 | 姚大庆 | 数码 | 55 |
15 | 武汉 | 许日扬 | 色彩 | 60 |
16 | 上海 | 田明生 | 静电 | 85 |
17 | 广州 | 李锡池 | 数码 | 76 |
18 | 广州 | 季河 | 色彩 | 60 |
19 | 青岛 | 廖旭华 | 静电 | 65 |
20 | 西安 | 陈志斌 | 数码 | 90 |
21 | 昆明 | 向祖强 | 色彩 | 85 |
任务1. 统计大于等于 85 分的人次。
这个可以用Countif 函数。语法,COUNTIF(range,criteria)。具体到我的例子,就是“=COUNTIF(D2:D21,">=85")”。查询范围最好写具体点,如果写成“D:D”,实际上是“D1:D65536”。Countif 的条件写法不太好捉摸,根据我的经验,可以是数字,单元格引用和字符串,但不能是函数。如果没有出现比较运算操作符,就表示要和数字或单元格引用指向的值相等。如果出现比较运算符,也是要放在字符串里才可以。像这样的写法是不通过的,=COUNTIF(D2:D21,>=85),会报Error。但把>=用引号括起来就对了,=COUNTIF(D2:D21,">="&85) 和 =COUNTIF(D2:D21,">= "&"85") 都是正确的表示方式。
任务2. 统计大于等于 60 分并小于85 分的人次。
我也很希望能把条件参数写成这个样子,=COUNTIF(D2:D21,AND(>=60,<85)),可惜Excel 不接受。COUNTIF函数在有单一条件的时候工作的很好,当有多个条件的时候就不灵了,扔出个错误对话框。根据我们任务的逻辑,我们可以用以下公式,=COUNTIF(D2:D21,">=60")-COUNTIF(D2:D21,">= 85")。
对于多条件判断的情况,我们可以用专业的条件判断函数 IF,
语法,IF(logical_test,value_if_true,value_if_false)。
IF 函数是可以嵌套的,在满足条件一后,进一步判断是否满足条件二,依此类推,根据MS Excel2003的帮助文件,最多可嵌套 7 个IF 函数。就我们的任务而言,我们需要两个判断,是否大于等于60分?是否小于80分?两个条件都满足就算上一个,否则就不计算。但 IF 函数只能设计为对每个要衡量的值返回“1”(计数)和“0”(不计数),我们还需要 SUM 这个函数把判断结果汇总起来。我们的公式可以写成这个样子:
=SUM( IF(D2:D21>=60, IF(D2:D21<85, 1, 0), 0) )
这是个数组公式(array formula),输入的时候需要按Ctrl+Shift+Enter,因此被称为CSE Formula。为什么说它是数组公式呢,它的判断表达式是这样的:D2:D21>= 60 和 D2:D21<85,表示对D2 到D21 整个范围中的每个值都要执行一遍条件判断,不同于单个值比较的写法,比如 IF(D2<85,1,0)。
对于数组公式,需要说明的是,如果没有按Ctrl+Shift+Enter 进行输入,那么它就没有数组公式的魔力了,变成对单一值进行计算的公式,比如,把上述公式放在 E2 单元格,就只对D2 的值进行判断,放在E3 单元格,就只判断D3 的值。
为达到同样的效果,用一个数组公式可以代替很多个普通公式。像这个例子中,我们用普通公式的等效做法是,在E2 单元格输入=IF(D2>=60,IF(D2<85,1,0),0),然后用Excel 的自动填充功能,按住E2 单元格右下角的小十字,一直拖到E21 单元格,再在E22 单元格输入 =SUM(E2:E21)。
顺便说一下,=SUM(IF(AND(D2:D21>=60,D2:D21<85),1,0),0) 的公式写法也是不能完成任务的。它从语法上是正确的,但是逻辑上是不对的。虽然从表面看,D2 到D21 整个范围中的每个值都要同时满足两个条件然后返回1,但是AND 这个函数的工作原理不是这样的,它确实做了20遍的比较,但是对20个比较的结果统一返回一个TRUE 或FALSE。可以用“Formula Auditing”工具栏上的“Evaluate Formula”查看它的运算过程。
对同一个问题,另一个跟 AND 函数功能类似的操作符(*),也表示两个条件都要满足,用在CSE 公式里是有效的,=SUM((D2:D21>=60)*(D2:D21<85))。
任务3. 统计来自上海并学习了静电的人次。
这个任务跟任务2 的逻辑是一样的,要满足两个条件:A2:A21="上海" 和C2:C21="静电"。不同的是任务2 中用来筛选的数据来自一个栏(字段),这个任务用来比较的数据来自两个栏(字段)。
用IF 函数的表达方式:
=SUM( IF(A2:A21="上海", IF(C2:C21="静电", 1, 0) ,0 ) )
用(*)的表达方式:
=SUM((A2:A21="上海")*(C2:C21="静电")) 因为False 和True 本身就表示 0 和1。
这两个公式都是CSE 公式,要按Ctrl+Shift+Enter 输入。
任务4. 给每个分数打上不同的等级。
规则是:大于等于90分,优;80到89分,良;70到79分,中;60到69分,差;小于60分,不及格。
看一下IF 函数的功力吧,在E2 单元格输入:
=IF(D2>=90,"优",IF(D2>=80,"良", IF(D2>=70,"中",IF(A2>=60,"差","不及格"))))
然后用Excel 的自动填充功能,按住E2 单元格右下角的小十字,一直拖到E21 单元格。
任务5. 列出有学员的城市和每个城市的学员人次。
这个任务分两步走。第一步,先列出有学员的城市。A 栏的城市包含重复项,我们要列出唯一的城市名来。
这个工作可以用Excel 的 Advanced Filter 功能来完成。这个功能要求被过滤的栏的第一行是栏头。
A 栏中的唯一值就被复制到G 栏了。
第二步,为G 栏中的每个城市统计学员人次。
选择H2 单元格,输入=COUNTIF($A$2:$A$21,G2)。用$A$2:$A$21 绝对引用表示法,是为了在复制的时候这个范围不发生变化。用Excel 的自动填充功能,把这个公式复制到其它H 栏的单元格。
这个任务用Excel 完成的效果,相当于数据库中的 select ...group by...。
附加题:统计出不止参加过一门课的人数,就是我表里用红色标出来的人名。条件是城市和姓名都相同才认为是同一个人,只是姓名一样,城市不一样不算同一个人。