SUM和IF使用求部分和

GROUP BY可以按照某一列的不同值进行分组,然后将不同组的数据可以利用聚合函数进行汇总取值。

--我们可以在老师表里面求解不同班级的老师分别有多少名
SELECT class_id,COUNT(teacher_id)
FROM teacher
GROUP BY class_id;

 

--我们可以在老师表里面求解每个班级里面最小的年龄和最大的年龄
SELECT class_id,MAX(age),MIN(age)
FROM teacher
GROUP BY class_id;

 

--我们可以在老师表里面求解每个班级老师们的工资总和
SELECT class_id,SUM(salary)
FROM teacher
GROUP BY class_id;

 

现在我们考虑一个新的问题,我们想要求解每个班级男老师的人数,正常来讲我们分组利用已有的函数只能汇总全部数据,想要进行部分汇总可以借助于IF函数:IF(condition, value_if_true, value_if_false),这里用下面的例子解释为:如果性别是男,则该行数据返回1,否则,返回0,利用SUM进行汇总就得到了男性的总数量,也就是整体的部分数量。

--我们可以在老师表里面求解每个班级男老师的数目
SELECT class_id,SUM(IF(sex='男',1,0))
FROM teacher
GROUP BY class_id;

 

Tips1

除了IF函数以外,我们还可以搭配CASE...WEHN...来实现,下面是其两种表达方式:

--第一种表达方式
CASE <单值表达式>
    WHEN <表达式值> THEN <SQL语句或返回值>
    WHEN <表达式值> THEN <SQL语句或返回值>
   ...
    WHEN <表达式值> THEN <SQL语句或返回值>
    ELSE <SQL语句或返回值>
END

--第二种表达方式
CASE 
    WHEN <判断表达式> THEN <SQL语句或返回值>
    WHEN <判断表达式> THEN <SQL语句或返回值>
   ...
    WHEN <判断表达式> THEN <SQL语句或返回值>
    ELSE <SQL语句或返回值>
END

--我们来用这种方式替换前面的IF函数
SELECT class_id,SUM(CASE sex WHEN '男' THEN 1 ELSE 0 END)
FROM teacher
GROUP BY class_id;

SELECT class_id,SUM(CASE WHEN sex = '男' THEN 1 ELSE 0 END)
FROM teacher
GROUP BY class_id;

Tips2

上面我们都是采用的SUM来计算,那么这里我们区分一下为什么不用COUNT来计算:COUNT是对结果集的数目进行汇总,SUM是对结果集中的数值进行加和,即使COUNT搭配CASE或者IF函数,结果也是不正确的,因为COUNT计数的是行数,无论里面的数值为0或者1,都会计入,所以这里不能用COUNT,而数值为0或1会影响SUM加和的结果。

posted @   妖码  阅读(140)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
点击右上角即可分享
微信分享提示