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. 新零售标杆 SKG 全面拥抱 Serverless,敏捷交付

    副标题:SKG 渠道中台借助 SAE +大禹打造云原生 DevOPS,提效 60% 作者:陈列昂(SKG).昕辰.龙琛.黛忻 项目背景 未来穿戴健康科技股份有限公司(SKG)是一家专注为个人与家庭提供 ...

  2. vant-list实现下拉加载更多

    1 <template> 2 <div class="home-wrapper"> 3 <div class="swipe-box" ...

  3. Linux-关机重启和注销

  4. VMto阿里云的简单过程

    VMto阿里云的简单过程 第一步打开网站 https://smcnext.console.aliyun.com/sourceServers/importMigrationSource?spm=5176 ...

  5. [转帖]018、数据库管理之TiDB升级

    升级 使用TiUP进行补丁升级(HotFix) 版本升级流程 升级准备-更新TiUP 升级准备- 编辑TiUP Cluster 升级准备- 集群监控状态检查 升级TiDB 集群 验证TiDB集群升级结 ...

  6. [转帖]ntp和chrony

    https://www.cnblogs.com/hiyang/p/12682234.html#:~:text=chrony%20%E7%AE%80%E4%BB%8B%20chrony%20%E6%98 ...

  7. [转帖]Xargs用法详解

    https://www.cnblogs.com/cheyunhua/p/8796433.html 1. 简介 之所以能用到这个命令,关键是由于很多命令不支持|管道来传递参数,而日常工作中有有这个必要, ...

  8. [转帖]Oracle入门精读28-字符集 AL32UTF8与UTF8

    字符(Character) 字符是各种文字和符号的总称,包括各国家文字.标点符号.图形符号.数字等. 字符编码(Character Encoding) 是一套法则,使用该法则能够对自然语言的字符的一个 ...

  9. 【贪心】AGC018C Coins

    Problem Link 现在有 \(X+Y+Z\) 个人,第 \(i\) 个人有三个权值 \(a_i,b_i,c_i\),现在要求依次选出 \(X\) 个人,\(Y\) 个人和 \(Z\) 个人(一 ...

  10. git中 commit 和 pull 的先后顺序问题会产生多余的merge记录

    commit 和 pull 的先后顺序问题 最近提交代码,发现一个问题. 自己很清楚的记得本次的提交是没有进行合并的. 奇怪的死 gitlab中的 history 历史中显示了我对本次进行了Merge ...