背景:最近用到统计之类的复杂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. 《Android自动化环境搭建》

    一.安装JDK并配置环境变量 1:在Java官网上下载本机系统相对应的jdk文件安装,直接下一步一步到位 2:配置JAVA_HOME 新建 JAVA_HOME 环境变量,变量值是所安装JDK 的路径, ...

  2. solidity 错误

    solidity版本 0.7.5 Member "transfer" not found or not visible after argument-dependent looku ...

  3. 千位分隔符的JS实现

    $.extend({ //千位分割符 MoneySeparator: function numFormat(num){ if(num==null){ return num; }else { num=n ...

  4. AOJ/高等排序习题集

    ALDS1_5_B-MergeSort. Description: Write a program of a Merge Sort algorithm implemented by the follo ...

  5. Ubuntu解决安装没有候选

    Ubuntu解决安装没有候选 很多初次上手的小白们最头疼的可能就是一下这种问题了 这是我也载过很多次的坑,原因是软件安装源的问题,需要去软件安装设置里更改合适的源 结局方案如下:(具体操作) 有个So ...

  6. MySQL MVCC原理深入探索

    一.MVCC的由来 二.MVCC的实际应用 RR级别场景 RC级别场景 三.MVCC的实现 3.1 多版本的数据从哪里来--Undo Log 3.1.1 插入操作对应的undo log 3.1.2 删 ...

  7. Spring源码之创建AOP代理之增强器的获取

    前言 在上一篇博文中我们说到了通过自定义配置完成了对AnnotationAwareAspectJAutoProxyCreator类型的自动注册,那么这个类究竟做了什么工作从而完成AOP的操作呢?首先我 ...

  8. Netty常用招式——ChannelHandler与编解码

    本文是Netty系列第8篇 上一篇文章我们深入学习了Netty逻辑架构中的核心组件ChannelHandler和ChannelPipeline,并介绍了它在日常开发使用中的最佳实践.文中也提到了,Ch ...

  9. 在Windows Server 2012R2离线安装.net framework3.5

    最近新装了一台Windows Server 2012 R2的服务器,安装数据库时,出现了提示安装不上 .net framework3.5的情况,经过网络上多次的资料查找及反复试验终于找到了一个可以解决 ...

  10. javascriptRemke之深入迭代

    javascriptRemke之深入迭代 前言:"迭代"意为按照顺序反复多次执行一段程序,ECMAscript6中新增了两个高级特性:迭代器与生成器,使用这两个特性能更高效地实现迭 ...