背景:最近用到统计之类的复杂Sql比较多,有种“提笔忘字”的感觉,看书练习,举一反三,巩固加强。

(一) 《SQL进阶教程》学习记录--CASE

(二) 《SQL进阶教程》学习记录--GROUP BY、PARTITION BY

1、语法

两种写法:简单 CASE 表达式(simple case expression)、搜索 CASE 表达式(searched case expression)

-- 简单 CASE 表达式
CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他' END -- 搜索 CASE 表达式
CASE WHEN sex = '1' THEN '男'
WHEN sex = '2' THEN '女'
ELSE '其他' END -- 可以用in
CASE WHEN address IN ('石家庄', '邯郸') THEN '河北'
WHEN address = '郑州' THEN '河南'
ELSE '其他' END

例1:统计各省人数,people表结构如下

SELECT
CASE
WHEN area IN ( '石家庄', '邯郸', '秦皇岛' ) THEN '河北'
WHEN area IN ( '郑州', '安阳' ) THEN '河南'
ELSE '其他' END as province,
SUM ( population ) as population
FROM people
GROUP BY province

看似没毛病,其实是有坑的,不同数据库是有区别的,这句在 PostgreSQL 和 MySQL 可以顺利执行,在 Oracle、 DB2、SQL Server 会报错province不存在,需要修改一下

SELECT province,SUM ( population ) as population from
(SELECT
CASE
WHEN area IN ( '石家庄', '邯郸', '秦皇岛' ) THEN '河北'
WHEN area IN ( '郑州', '安阳' ) THEN '河南'
ELSE '其他' END as province , population
FROM people ) peoplesum
GROUP BY province

其实,对于使用过多个库的开发人员,看错误也能八九不离十的写出来,重点是下面这种通用SQL,以前还真没Get过,就是把条件在写一遍,可能是因为会变长吧,哈哈哈哈~~~嗝

SELECT
CASE
WHEN area IN ( '石家庄', '邯郸', '秦皇岛' ) THEN '河北'
WHEN area IN ( '郑州', '安阳' ) THEN '河南'
ELSE '其他' END as province,
SUM ( population ) as population
FROM people
GROUP BY
CASE
WHEN area IN ( '石家庄', '邯郸', '秦皇岛' ) THEN '河北'
WHEN area IN ( '郑州', '安阳' ) THEN '河南'
ELSE'其他' END

以上三种写法,结果一致

2、行转列

高频“考点”,study表结构如下

SELECT
username,
SUM ( CASE subject WHEN '语文' THEN fraction ELSE 0 END ) AS yuwen,
SUM ( CASE subject WHEN '数学' THEN fraction ELSE 0 END ) AS shuxue,
SUM ( CASE subject WHEN '英语' THEN fraction ELSE 0 END ) AS yingyu
FROM
study
GROUP BY
username

3、条件更新

公司受疫情影响,全员降薪,挣得多降的多。月薪>=10w,减20%,10w>月薪>=5,减10%,5w>月薪>=1w,减5%,月薪<1w,不变(毕竟生活太难了),如表:万万不可分次执行,因为有的人工资降完又符合了更低档的要求,再降就没法活了。。。当然你可以从低到高执行三次,更简单的如下:

update salaries set salary = CASE WHEN salary >= 100000 THEN salary*0.8
WHEN salary >= 50000 AND salary < 100000 THEN salary*0.9
WHEN salary >= 10000 AND salary < 50000 THEN salary*0.95
ELSE salary END;

4、嵌套CASE

学以致用,真实需求搞一把。按月分别统计连续两个月高报警、低报警时长综合。简化如表:

SELECT
SUM(CASE to_char(create_time,'yyyy-MM') WHEN '2021-08' THEN (CASE alarm_level WHEN '高报' then time_span else 0 end) ELSE 0 END ) as 本月高报,
SUM(CASE to_char(create_time,'yyyy-MM') WHEN '2021-08' THEN (CASE alarm_level WHEN '低报' then time_span else 0 end) ELSE 0 END ) as 本月低报,
SUM(CASE to_char(create_time,'yyyy-MM') WHEN '2021-07' THEN (CASE alarm_level WHEN '高报' then time_span else 0 end) ELSE 0 END ) as 上月高报,
SUM(CASE to_char(create_time,'yyyy-MM') WHEN '2021-07' THEN (CASE alarm_level WHEN '低报' then time_span else 0 end) ELSE 0 END ) as 上月低报
FROM alarm_info

(一)《SQL进阶教程》学习记录--CASE的更多相关文章

  1. 《SQL基础教程》+ 《SQL进阶教程》 学习笔记

    写在前面:本文主要注重 SQL 的理论.主流覆盖的功能范围及其基本语法/用法.至于详细的 SQL 语法/用法,因为每家 DBMS 都有些许不同,我会在以后专门介绍某款DBMS(例如 PostgreSQ ...

  2. SpringCloud基础教程学习记录

    这个学习记录是学习自翟永超前辈的SpringCloud的基础教程. 自己写这个教程的目的主要是在于,想要更凝练总结一些其中的一些实用点,顺便做个汇总,这样自己在复习查看的时候更加方便,也能顺着自己的思 ...

  3. 《SQL 进阶教程》 case:将已有编号方式转换为新的方式并统计

    SQL 权威指南SQL 解惑在进行非定制化统计时,需要将已有编号方式转换为另外一种便于分析的方式进行统计需求 select case when name='哈尔滨' then '黑龙江' when n ...

  4. 《SQL 进阶教程》 case:练习题1-1-3 用 ORDER BY 指定顺序进行排序

    select name from greatestsORDER BY case when name ='B' then 1 when name ='A' then 2 when name ='D' t ...

  5. 《SQL 进阶教程》 case:练习题1-1-1 多列数据的最大值

    select name, case when case when x > y then x else y end < z then z else case when x < y th ...

  6. 《SQL 进阶教程》 case:练习题1-1-2 转换行列——在表头里加入汇总列

    select case when sex = 1 then '男性' else '女性' end as '性别', sum(case when name='哈尔滨' THEN population e ...

  7. 《SQL 进阶教程》 case:在 CASE 表达式中使用聚合函数

    1.只加入一个社团的学生的社团id select std_id, max(club_id) from student_clubgroup by std_idhaving count(*) =1---- ...

  8. 《SQL 进阶教程》case :用一条 SQL 语句进行不同条件的统计

    进行不同条件的统计是case表达式的著名用法之一 select name,sum(case when sex = 1 then population else 0 end) as cnt_m,sum( ...

  9. 《SQL 进阶教程》 case:在 UPDATE 语句里进行条件分支

    1.对当前工资为30万日元以上的员工,降薪10%:2.对当前工资为25万日元以上且不满28万日元的员工,加薪20% update salaries set salary = case when sal ...

随机推荐

  1. Jmeter系列(26)- 常用逻辑控制器(5) | 循环控制器Loop Controller

    循环控制器(Loop Controller) 字面意思,循环该控制器下的请求 设定固定循环次数,或者一直循环 同线程组的循环是父子关系,大家可以试下,如果线程组设置了一直循环,而循环控制器设置了2次, ...

  2. git 要求密码的解决方法:【生成gitLab公钥】:以及如何配置GitLab中的SSH key

    参考链接: https://www.cnblogs.com/yjlch1016/p/9692840.html https://blog.csdn.net/u011925641/article/deta ...

  3. redis的持久化 与事务管理

    1. redis的持久化 Redis的持久化主要分为两部分:RDB(Redis DataBase), AOF(Append Only File) 2. 什么是redis 的持久化        在指定 ...

  4. SpringSecurity系列学习(一):初识SpringSecurity

    SpringSecurity Spring Security是spring采用AOP思想,基于servlet过滤器实现的安全框架.它提供了完善的认证机制和方法级的 授权功能.是一款非常优秀的权限管理框 ...

  5. P6880-[JOI 2020 Final]オリンピックバス【最短路】

    正题 题目链接:https://www.luogu.com.cn/problem/P6880 题目大意 给出\(n\)个点\(m\)条边的有向图,边有边权和一个翻转权值. 翻转至多一条边使得\(1-& ...

  6. Maccms8.x(苹果cms)命令执行漏洞

    getshell payload(a): http://0-sec.org/index.php?m=vod-search&wd={if-A:assert($_POST[a])}{endif-A ...

  7. (Java)面向对象的三大特征

    封装.继承与多态 封装 封装的作用(好处) 提高程序安全性,保护数据 隐藏代码的实现细节 统一接口 增加系统可维护性 属性私有(关键字private) 加上Private可使该属性私有于一个类,在其他 ...

  8. Idea热部署功能

    什么是Idea自动热部署? 热部署是指代码改动之后,调试过程中会服务自动重启,减少手动重启的麻烦,尤其是在微服务开发中,涉及到很多模块的调试更为重要. 如何开启热部署功能? 1.添加如下依赖到项目模块 ...

  9. 洛谷3721 HNOI2017单旋(LCT+set+思维)

    这题难道不是spaly裸题吗? 言归正传QWQ 一看到这个题目,其实第一反应是很懵X的 从来没有见过类似的题目啊,什么\(spaly\),单旋.QWQ很懵逼啊 不过,我们可以注意到这么一件事情,就是我 ...

  10. C# datagridview、datagrid、GridControl增加行号

    01 - WinForm中datagridview增加行号 在界面上拖一个控件dataGridView1,在datagridview添加行事件中添加如下代码: private void dataGri ...