SQL 条件求和

SUMIF

就是 Excel 中的 sumif () 函数的功能. 工作中用的频率极其高, 像我就几乎天天在用的呢. 也是做个简单的笔记而已. 为啥我总是喜欢对比 Excel 呢, 因为我也渐渐发现, Excel 是业务小姐姐和开发人员 唯一的沟通桥梁. 有时候也不禁感慨, 像我这种, 又能做业务, 做 Excel 表格, 同时又能兼数据开发的小哥哥难道不香嘛, 不抢手嘛...

数据工作: 文员用的 Excel 就相当于开发人员用 SQL. 都是必须会的.

因为我平时用的是数据库是 Sybase IQ, 这种列式的, OLAP 型的. 特点就是, 高吞吐, 查询极快. 正好适合我做数据报表这种的极速响应. 一般如果是 千万级以下的数据呢, 我还是有些用 Mysql, 就是喜欢呀, 没啥. 但千万级以上的数据量, 你会发现 MysSql 的性能会 急剧下降. 就执行下 select count(*) from tb 就直接GG 了.

说个我真实的面试怼怼:

就一些公司老是喜欢问我 Mysql 怎查询优化, 怎么大数据之类的话题, 我真的就懒得回答, 有一次就真的怼:

只有没有钱的公司才老想着优化, 我们都是直接换更好的设备.

扯远了, 回到 sumif 求和. 还是用 Mysql 来演示一把. SQL 大多数都差不多呢.

需求

对某个字段进行 条件求和, 即 Excel 的 sumif 功能

实现

用mysql 的 IF( ) 函数就能实现. 简单以 score 表为例.

mysql> select * from cj.score;
+------+------+-------+
| s_id | c_id | score |
+------+------+-------+
| 0001 | 0001 |    80 |
| 0001 | 0002 |    90 |
| 0001 | 0003 |    99 |
| 0002 | 0002 |    60 |
| 0002 | 0003 |    80 |
| 0003 | 0001 |    80 |
| 0003 | 0002 |    80 |
| 0003 | 0003 |    80 |
+------+------+-------+
8 rows in set (0.00 sec)

需求是, 求出不同 s_id 在 课程id 为 "0001" 的 学生总分数. 当然可以只用 group by having 之类的 哈, 这里就为了举个栗子. 理解意思即可.

select 
	a.s_id, 
	sum(if(a.c_id = '0001', score, 0)) as sum_0001
from cj.score as a 
group by a.s_id
+------+----------+
| s_id | sum_0001 |
+------+----------+
| 0001 |       80 |
| 0002 |        0 |
| 0003 |       80 |
+------+----------+
3 rows in set (0.00 sec)

当然, 在 IQ 其实是不支持这种 if( ) 语法的, 于是呢, 可以用 case when 来达到同样的效果呢.

-- case when 
select 
	a.s_id, 
	sum(case when a.c_id = '0001'then score else 0 end) as sum_0001
from cj.score as a 
group by a.s_id
+------+----------+
| s_id | sum_0001 |
+------+----------+
| 0001 |       80 |
| 0002 |        0 |
| 0003 |       80 |
+------+----------+
3 rows in set (0.00 sec)

case when 果然是有点强大, 尤其是在我处理, 用户的那些垃圾数据, 和行列转换时经常要用的呢. 不扯了, 就简单一个笔记而已.

posted @ 2020-09-13 20:19  致于数据科学家的小陈  阅读(5207)  评论(0编辑  收藏  举报