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

  • 相关阅读:
    Java多线程、并发
    Java I/O系统
    Java注解
    Arthas(Java诊断工具)
    Java泛型
    Java内部类
    libpcap使用
    python文件服务器
    设计模式
    protobuf
  • 原文地址:https://www.cnblogs.com/chenjieyouge/p/13662953.html
Copyright © 2020-2023  润新知