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加和的结果。

SUM和IF使用求部分和的更多相关文章

  1. HDU 3473 Minimum Sum (划分树求区间第k大带求和)(转)

    题意:在区间中找一个数,求出该区间每个数与这个数距离的总和,使其最小 找的数字是中位数(若是偶数个,则中间随便哪个都可)接着找到该区间比此数大的数的总和 区间中位数可以使用划分树,然后在其中记录:每层 ...

  2. 杭电1003 Max Sum 【连续子序列求最大和】

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1003 题目意思: 即给出一串数据,求连续的子序列的最大和 解题思路: 因为我们很容易想到用一个max ...

  3. 杭电 5053 the Sum of Cube(求区间内的立方和)打表法

    Description A range is given, the begin and the end are both integers. You should sum the cube of al ...

  4. Sum Problem

    2018-04-22 19:59:52 Sum系列的问题是Leetcode上的一个很经典的系列题,这里做一个简单的总结. 167. Two Sum II - Input array is sorted ...

  5. LeetCode(307) Range Sum Query - Mutable

    题目 Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclus ...

  6. 练习2-15 求简单交错序列前N项和 (15 分)

    练习2-15 求简单交错序列前N项和 (15 分) 本题要求编写程序,计算序列 1 - 1/4 + 1/7 - 1/10 + ... 的前N项之和. 输入格式: 输入在一行中给出一个正整数N. 输出格 ...

  7. 练习2-14 求奇数分之一序列前N项和 (15 分)

    练习2-14 求奇数分之一序列前N项和 (15 分) 本题要求编写程序,计算序列 1 + 1/3 + 1/5 + ... 的前N项之和. 输入格式: 输入在一行中给出一个正整数N. 输出格式: 在一行 ...

  8. 练习2-13 求N分之一序列前N项和 (15 分)

    练习2-13 求N分之一序列前N项和 (15 分) 输入在一行中给出一个正整数N. 输出格式: 在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后6位.题目保证计算结果不超过双精度范 ...

  9. UVALive 4682 XOR Sum (trie)

    题意:求一段连续的数字使得它们的异或和最大. 思路:首先利用前缀和求sum[i],这样求某段连续数字异或和最大就是求某两个j和i满足sum[i]^sum[j-1]最大,问题就变成了找两个数的异或最大. ...

  10. POJ 1060 Modular multiplication of polynomials(多项式的加减乘除,除法转化成减法来求)

    题意:给出f(x),g(x),h(x)的 (最高次幂+1)的值,以及它们的各项系数,求f(x)*g(x)/h(x)的余数. 这里多项式的系数只有1或0,因为题目要求:这里多项式的加减法是将系数相加/减 ...

随机推荐

  1. RSAC创新沙盒十强出炉,这家SCA公司火了

    引言 近日,全球网络安全行业创新风向标RSAC创新沙盒公布了本年度入围十强的名单,软件供应链安全企业Endor Labs凭借基于依赖关系建立应用开发生命周期的解决方案获得了广泛关注. Endor La ...

  2. BFS(广度优先搜索) poj3278

    ***今天发现一个很有趣的是,这道题应该几个月前就会了,但是一次比赛中总是WA,果断C++提交,然后就过了,然后就很无语了,G++不让过C++能过,今天又交一遍发现把队列定义为全局变量就都能过了,至于 ...

  3. 阿里巴巴MYSQL 开发规范

    转载请注明出处: (一) 建表规约 1. [强制]表达是与否概念的字段,必须使用 is_xxx 的方式命名,数据类型是 unsigned tinyint(1 表示是,0 表示否). 说明:任何字段如果 ...

  4. 解决 idea maven plugins 报红波浪线

    导入新项目到 idea 的时候,由于依赖的环境以及项目中 maven 编译所依赖的pom的版本不同,很多时候导入到idea的时候 maven Plugins 会出现报红的情况,这是由于maven仓库中 ...

  5. spring--集成RocketMQ

    在Spring Boot中集成RocketMQ通常涉及以下步骤: 1. **添加依赖**:首先,需要在项目的`pom.xml`文件中添加RocketMQ的Spring Boot Starter依赖. ...

  6. Blazor开发小游戏?趁热打铁上!!!

    大家好,我是沙漠尽头的狼. 网站使用Blazor重构上线一天了,用Blazor开发是真便捷,空闲时间查查gpt和github,又上线一个 正则表达式在线验证工具 和几个在线小游戏,比如 井字棋游戏.扫 ...

  7. CSS - 使用CSS 3D属性来完成页面视差滚动效果。

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. python环境 anaconda安装

    官网: https://www.anaconda.com/distribution/#macos 国内镜像: https://mirrors.tuna.tsinghua.edu.cn/anaconda ...

  9. MyBatis05——一对多和多对一处理

    多对一处理 1.数据库表的设计 CREATE TABLE `teacher` ( `id` INT(10) NOT NULL, `name` VARCHAR(30) DEFAULT NULL, PRI ...

  10. [转帖]linux shell 中数组的定义和for循环遍历的方法

    https://www.cnblogs.com/ysk123/p/11510718.html linux 中定义一个数据的语法为: variable=(arg1 arg2 arg3 ....) 中间用 ...