Excel 中统计某个项目出现的次数,以及模拟SQL的Group by效果

我工作中要处理的数据,很多时候要统计某个项目出现的次数。以下面某个月的培训数据为例讲一下Excel 的技巧。
  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 功能来完成。这个功能要求被过滤的栏的第一行是栏头。

  1. 选择Data 菜单,点击 Filter-> Advanced Filter
  2. 在 Advanced Filter 对话框,选择 Copy to another location
  3. 点击 List range 输入框并选择要过滤的数据,在我们的例子里是A2:A21。
  4. 点击 Copy to 输入框并选择要复制到的一个空白栏,比如我们选G 栏。 
  5. 选择 Unique records only 并点击 OK

A 栏中的唯一值就被复制到G 栏了。

第二步,为G 栏中的每个城市统计学员人次。

选择H2 单元格,输入=COUNTIF($A$2:$A$21,G2)。用$A$2:$A$21 绝对引用表示法,是为了在复制的时候这个范围不发生变化。用Excel 的自动填充功能,把这个公式复制到其它H 栏的单元格。

这个任务用Excel 完成的效果,相当于数据库中的 select ...group by...。

附加题:统计出不止参加过一门课的人数,就是我表里用红色标出来的人名。条件是城市和姓名都相同才认为是同一个人,只是姓名一样,城市不一样不算同一个人。

你可能感兴趣的:(Office,组件)