CASE WHEN函数@sql学习

2023-05-16

mysql中可以使用CASE WHEN函数完成数据分组。

CASE WHEN函数用来对数据进行判断和分组

来自MySQL触发器里的流程控制语句 知识。

CASE WHEN是SQL编程中常用的条件控制语句。

 

CASE WHEN的功能

  • 新数据项加工

用途:根据现有字段,利用Case When语句进行逻辑判断,可加工得到新的字段。

比如计算得到新字段“年龄层”、“资产等级”

  • 汇总信息加工

用途:Case When 语句与汇总函数(如Sum函数)相结合,能够实现更加灵活的汇总信息加工功能。

Tips:想对group by之后对某些字段进行统计,使用很方便

就好比groupby之后想对性别进行统计

  • 筛选条件控制

用途:Case When 还可以用在 筛选条件中,以实现更加灵活的筛选条件控制。

 

case when 的语法有两种:这两种语法有什么区别呢?

1、简单函数:枚举这个字段所有可能的值*

CASE [col_name]

WHEN [value1] THEN [result1]

WHEN [value2] THEN [result2]

ELSE [default]

END

 

2、搜索函数(条件判断)

可以写判断,并且搜索函数只会返回第一个符合条件的值,其他case被忽略

CASE

WHEN [expr] THEN [result1]

WHEN [expr] THEN [result2]

ELSE [default]

END

 

 

  • 新数据项加工

例;(简单函数)根据英雄的名字,匹配属于他们的装备(“装备”为新数据项)

SELECT
    NAME '英雄',
    CASE NAME
        WHEN '德莱文' THEN   '斧子'
        WHEN '德玛西亚-盖伦' THEN   '大宝剑'
        ELSE  '无'
    END [as] '装备'
FROM    user_info;

 

例:(搜索函数)根据年龄,创建新数据项“年龄段”,字段分组

-- when 表达式中可以使用 and 连接条件
SELECT
    NAME '英雄',    age '年龄',
    CASE
        WHEN age < 18 THEN   '少年'
        WHEN age < 30 THEN   '青年'
        WHEN age >= 30  AND age < 50 THEN   '中年'
        ELSE   '老年'
END [as] '年龄段'
FROM    user_info;
  • 汇总信息加工

例:(配合聚集函数)统计80前与80后的人中,男、女客户的人数。

SELECT 
	CASE WHEN birth_dt < mdy(1,1,1980) THEN '80前' ELSE '80后' END as 年龄段
	, SUM( CASE WHEN gender = '1' THEN 1 ELSE 0 END) as 男性数量
	, SUM( CASE WHEN gender = '2' THEN 1 ELSE 0 END) as 女性数量
FROM custom_info
GROUP BY 年龄段 

问题:group by根据年龄段,但是好像没看到分组后的聚集,思考SQL执行过程,像是先得到新数据项‘年龄段’,再根据年龄段进行男女数量的统计。

 

例:按cls_id统计每个班的男、女生数量

use sc_sys;
-- 查看学生表(结果1)
SELECT * FROM tb_student;
-- 按cls_id 分班,创建新的数据项“班别”(结果2)
SELECT *, 
	CASE cls_id
		WHEN 1 THEN '1班'
		WHEN 2 THEN '2班'
		WHEN 3 THEN '3班'
		WHEN 4 THEN '4班'
		WHEN 5 THEN '5班'
		WHEN 6 THEN '6班'
		WHEN 7 THEN '7班'
		WHEN 8 THEN '8班'
		ELSE '其他班级'
	END as 班别
FROM tb_student ORDER BY 班别, ssex DESC;

-- 按cls_id创建班别,并统计每个班别的男、女生数量(结果3)
SELECT 
	CASE cls_id
		WHEN 1 THEN '1班'
		WHEN 2 THEN '2班'
		WHEN 3 THEN '3班'
		WHEN 4 THEN '4班'
		WHEN 5 THEN '5班'
		WHEN 6 THEN '6班'
		WHEN 7 THEN '7班'
		WHEN 8 THEN '8班'
		ELSE '其他班级'
	END 班别
	, SUM( CASE WHEN ssex = '男' THEN 1 ELSE 0 END) as 男性数量
	, SUM( CASE WHEN ssex = '女' THEN 1 ELSE 0 END) as 女性数量
FROM tb_student
GROUP BY 班别;

Tips:想对group by之后对某些字段进行统计,使用很方便

就好比groupby之后想对性别进行统计

 

-- 按cls_id创建班别,并统计每个班别的男、女生数量(结果4)
SELECT 
	CASE cls_id
		WHEN 1 THEN '1班'
		WHEN 2 THEN '2班'
		WHEN 3 THEN '3班'
		WHEN 4 THEN '4班'
		WHEN 5 THEN '5班'
		WHEN 6 THEN '6班'
		WHEN 7 THEN '7班'
		WHEN 8 THEN '8班'
		ELSE '其他班级'
	END 班别, ssex, COUNT(*) 数量
FROM tb_student
GROUP BY 班别, ssex DESC
ORDER BY 班别;
-- 若报错,将班别改为class,即字段命名最好还用英文
-- Unknown column '班別' in 'order clause'

 

  • 筛选条件控制

    例:筛选目标客户名单,

    对于0200地区,以资产大于等于100万的客户为目标客户,

    对于其它地区,以资产大于等于50万为目标客户。

    输出目标客户的客户编号、姓名、手机号码、地区号和总资产。

SELECT  Party_Id, Name, Mobile, Zone_Num, Total_Asset 
FROM   Custom_Info
WHERE  CASE  WHEN  Zone_Num='0200'  THEN   Total_Asset>=1000000 
        	  ELSE   Total_Asset>=500000   
        END
-- 即针对0200地区,使用条件Total_Asset>=1000000
-- 而针对其他地区,使用条件Total_Asset>=500000  
  • 其他功能:行转列

例:聚合函数 sum 配合 case when 的简单函数实现行转列,别名

-- 聚合函数 sum 配合 case when 的简单函数实现行转列
SELECT  st.stu_id '学号',   st.stu_name '姓名',
    sum( CASE co.course_name  WHEN '大学语文' THEN  sc.scores ELSE  0 END ) '大学语文',
    sum( CASE co.course_name  WHEN '新视野英语' THEN sc.scores  ELSE  0 END ) '新视野英语',
FROM    edu_student st
LEFT JOIN edu_score sc ON st.stu_id = sc.stu_id
LEFT JOIN edu_courses co ON co.course_no = sc.course_no
GROUP BY    st.stu_id
ORDER BY    NULL;
-- 注释:group by后默认排序 后面跟上order by null表示 不排序,查询速度更快。

这种功能有点像之前的帖子想要实现的功能,《数据划分处理(基于python的pandas中的dataframe数据结构)》,链接https://blog.csdn.net/Cameback_Tang/article/details/102876947

 

Case when函数还能用于groupby中

-- 查询output的分布
select 
case when output < -500 then '(, -500)'
when output < -250 then '[-500, -250)'
when output < -200 then '[-250, -200)'
when output < -128 then '[-200, -128)'
when output < -88  then '[-128, -88)'
when output < -18  then '[-88, -18)'
when output < 0    then '[-18, 0)'
when output = 0    then '0'
else 'else' end output_bin
, count(user_id) cnt
from data_table
group by case when output < -500 then '(, -500)'
when output < -250 then '[-500, -250)'
when output < -200 then '[-250, -200)'
when output < -128 then '[-200, -128)'
when output < -88  then '[-128, -88)'
when output < -18  then '[-88, -18)'
when output < 0    then '[-18, 0)'
when output = 0    then '0'
else 'else' end

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CASE WHEN函数@sql学习 的相关文章

  • 对于数据库来说,选择正确的数据类型会影响性能吗?

    如果是这样 为什么 我的意思是 tinyint 的搜索速度比 int 快吗 如果是这样 性能上的实际差异是什么 是的 根据数据类型 它确实有所不同 int vs tinyint不会在速度上产生明显的差异 但会在数据大小上产生差异 假设tin
  • 如何有效地从 DB2 表中删除所有行

    我有一个大约有 50 万行的表 我想删除所有行 如果我做简单的delete from tbl 事务日志已满 我不关心这种情况下的事务 无论如何我都不想回滚 我可以删除许多事务中的行 但是有更好的方法吗 如何有效地从 DB2 中的表中删除所有
  • java mysql 准备好的语句

    我正在尝试使用 java 向数据库中进行简单的插入 它告诉我我的 sql 语法已关闭 但是 当我复制打印出来的字符串并将其放入 phpmyadmin 中的 sql 命令中时 它会正确执行该命令 并且我似乎无法弄清楚 java 中的字符串查询
  • 如何将可视选择的文本通过管道传输到 UNIX 命令并将输出附加到 Vim 中的当前缓冲区

    使用 Vim 我尝试将在可视模式下选择的文本通过管道传输到 UNIX 命令 并将输出附加到当前文件的末尾 例如 假设我们有一个 SQL 命令 例如 SELECT FROM mytable 我想做如下的事情
  • 更改迁移中的自动​​增量值(PostgreSQL 和 SQLite3)

    我有一个托管在 Heroku 上的项目 想要更改表的自动增量起始值 我在本地使用 SQLite3 Heroku 使用 PostgreSQL 这是我在迁移中所拥有的 class CreateMytable lt ActiveRecord Mi
  • 拆分列中的字符串并在列中添加值

    我有一个包含几行数据的表 如下所示 16 W 2 Work ALBO 00 Proposal ALxO Amendement 1 20091022 signed pdf 17 W 2 Work ALBO 00 Proposal Level1
  • 如何在 Visual Studio 中更改 Azure 数据库表的列顺序

    我整个下午都在寻找在 MS Visual Studio 2022 中重新排序 Azure 数据库表列的方法 没有运气 在其他应用程序中 可以通过拖动或剪切和粘贴轻松重新排列列 这里无能为力 此时 我什至不确定可以在 VS 中移动列 我只对
  • 分层查询

    我希望我能够解释困扰我的问题 我有以下分层数据集 这只是 34K 记录的子集 PARENT ID CHILD ID EXAM TUDA12802 TUDA12982 N TUDA12982 TUDA12984 J TUDA12984 TUD
  • 插入触发器最终在分区表中插入重复行

    我有一个分区表 我认为 适当的INSERT触发器和一些限制 不知何故 INSERT语句为每个语句插入 2 行INSERT 一个用于父分区 一个用于相应的分区 设置简要如下 CREATE TABLE foo id SERIAL NOT NUL
  • 在sqlite SQL语句中与order by子句结合使用limit

    下面的两条 SQL 语句总是会产生相同的结果集吗 1 SELECT FROM MyTable where Status 0 order by StartTime asc limit 10 2 SELECT FROM SELECT FROM
  • sql server 按组排名

    问题看似简单 但我却无法理解 这是针对 sql 服务器的 what I have in a table What I need as a output cksum id cksum id 2162514679 204 2162514679
  • 对多个数据库执行 SQL 查询

    我知道我的帖子与该论坛中的其他帖子的标题非常相似 但我真的找不到我需要的答案 这是我的问题 我的 Windows Server 上运行着 SQL Server 在我的 SQL Server 中 我有大约 30 个数据库 它们都具有相同的表和
  • MySQL 按重复项从上到下排序

    我有一个lammer问题 因为我不是mysql专业人士 我有类似的字段 id color 1 red 2 green 3 yellow 4 green 5 green 6 red 我想按重复项进行分组 最常见的重复项先进行分组 所以应该这样
  • 为什么 SqlClient 在传递 SqlXml 时使用不必要的 XML 转换?

    我有一个关于从 C 代码将 xml 数据类型传递给查询的问题 首先 这是 SQL Server 上的一个表 CREATE TABLE dbo XmlTable id int IDENTITY 1 1 NOT NULL dat xml NOT
  • 为表中的每个组选择前 N 行

    我面临一个非常常见的问题 即 为表中的每个组选择前 N 行 考虑一个表id name hair colour score列 我想要一个结果集 对于每种头发颜色 都能得到前 3 名得分手的名字 为了解决这个问题 我得到了我所需要的Rick O
  • 自加入表

    我有一张像这样的桌子 Employee name salary a 10000 b 20000 c 5000 d 40000 我想获取所有工资高于A工资的员工 我不想使用任何嵌套或子查询 在采访中被问及并暗示是使用自连接 我真的不知道如何实
  • XML 解析:格式良好的检查:未声明的实体

    我正在使用 SSMS 2008 但收到以下错误 你知道这意味着什么吗 Msg 9448 Level 16 State 1 Line 4 XML parsing line 1 character 89 well formed check un
  • 执行带有 EXCEPTION 的 PostgreSQL 查询会导致两条不同的错误消息

    我有一个 PostgreSQL 查询 其中包含事务和列重复时的异常 BEGIN ALTER TABLE public cars ADD COLUMN top speed text EXCEPTION WHEN duplicate colum
  • 如何使用 LAMBDA 表达式在 LINQ 中执行 IN 或 CONTAINS?

    我有以下 Transact Sql 我正在尝试将其转换为 LINQ 并且很挣扎 SELECT FROM Project WHERE Project ProjectId IN SELECT ProjectId FROM ProjectMemb
  • 如何获得顶部带有千位分隔符的数字?

    SELECT count FROM table A 假设结果是8689 我怎样才能将它转换为8 689在 SQL Server 上 尝试这样 select replace convert varchar convert Money coun

随机推荐

  • VMware虚拟机中安装的Linux系统无法识别U盘解决方法

    文章目录 1 问题描述2 解决方法3 参考文献 1 问题描述 如图1所示 xff0c 在VMware安装的Linux系统 xff08 Ubuntu 无法读取U盘 图 1 U盘读取失败 2 解决方法 原因在于所用的U盘为3 0接口 xff0c
  • 解决error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools"两个方法

    简述 在Windows下的pycharm安装出现 Microsoft Visual C 43 43 14 0 is required Get it with 34 Microsoft Visual C 43 43 Build Tools的解
  • ubuntu 18.04源码安装mysql 5.7.18

    一 安装依赖包 sudo apt update sudo apt install cmake bison libncurses5 dev build essential 二 下载 mysql 5 7 18源码 源码 传送门 选择那个包含bo
  • 什么叫做装箱和拆箱?一看就懂系列

    有很多同学对与装箱和拆箱还是有点搞不太明白 首先讲一下概念 xff1a 1 装箱指的是把值类型转化为引用类型 2 拆箱当然指的就是把引用类型转化为值类型 估计很多同学可能还分不清哪些是属于引用类型和值类型 这个就需要自己去强化记忆一下了 光
  • java 和javascript的区别?你是否还在把他们混为一谈呢

    1 javascript是基于对象的 xff0c 它是一种脚本语言 xff0c 是一种基于对象和事件驱动的编程语言 xff0c 因而它本身提供了非常丰富的内部对象供设计人员使用 而Java是面向对象的 xff0c 即Java是一种真正的面向
  • vs2019智能提示设置为中文

    官网修改中文提示地址 xff1a https docs microsoft com zh cn dotnet core install localized intellisense 1 去官网下载intellisense语言包 下载链接 x
  • .net中的定时任务

    FluentScheduler是什么 xff1f FluentScheduler是 net中的任务调度框架 xff0c 也就是你如果想在 net程序跑一段代码 xff0c 同时又不影响主程序的运行时 就可以使用FluentScheduler
  • 实用的Visual Studio插件

    打开Visual Studio 扩展 管理扩展 安装自己需要的插件 01 CodeMaid CodeMaid快速整理代码文件 xff0c 规范你的代码 xff0c 提高代码阅读体验 代码自动对齐 xff0c 格式化代码 xff08 ps x
  • mysql 数据库信息探索

    mysql 数据库信息探索 xff08 1 xff09 查询数据库的表数量 SELECT COUNT TABLES table schema FROM information schema TABLES GROUP BY table sch
  • .net 6 基于AspNetCoreRateLimit的限流

    1 安装包 AspNetCoreRateLimit 2 在appsetting cs中加入IpRateLimiting配置节点 span class token comment 限流配置 span span class token stri
  • 关于汉字转拼音并排序解决方案

    使用方法 xff1a 写一个静态帮助类 span class token keyword public span span class token keyword static span span class token keyword c
  • .NET Core6 中使用AutoMapper

    1 引入AutoMapper包 2 新建一个类 xff1a MappingProfile xff0c 类名自定义 xff0c 但是必须要继承 Profile类 用于创建映射规则 如图 xff1a Student为源数据 xff08 我这里是
  • 使用Python调用百度OCR

    使用Python调用百度OCR 注册 登录百度智能云创建应用安装python SDK接口说明代码实现 xff08 本地图片 xff09 代码实现 xff08 使用url上的图片并使用可选参数 xff09 注册 登录百度智能云 注册请点击 登
  • 001 超全C语言程序设计概念

    前言 此笔记主要参考自赵海英老师的C语言课程 xff0c 此笔记是在考研重新学习C语言的情况下进行的整理 xff0c 主要用于后续的C语言概念温故知新 第一章 基础知识 1 数制及转换 四种数制 xff1a 二进制 十进制 八进制 十六进制
  • 使用@Autowired注解警告Field injection is not recommended

    问题 xff1a 在使用变量方式依赖注入时 xff0c 提示Field injection is not recommended 64 Autowired LogService logService 虽然变量方式注入非常简洁 xff0c 但
  • mybatis动态数据源,分页插件失效

    mybatis动态数据源 xff0c 分页插件失效 发表于 xff1a 2020 08 18 20 42 47 阅读量 xff1a 9 作者 xff1a 黄叶 原因 xff1a 使用动态数据源 xff1a 数据正常但是total为0 解决
  • mybatis动态数据源配置使用事务不生效

    原因 xff1a 因为我使用的是配置的方式来加载数据源 xff0c 因此我们还需要对事务管理器进行一个配置 解决 xff1a 在代码中添加 配置事物 64 param dataSource 64 return 64 Bean public
  • Caffeine cache实现本地缓存(简单又清楚)

    Caffeine cache实现本地缓存题 缓存填充策略 手动加载 介绍 xff1a 使用方式 xff1a 同步加载 介绍 xff1a 使用方式 xff1a 异步加载 介绍 xff1a 注意 xff1a 异步和同步使用方式相似 这里的话主要
  • 商城后台系统 — 新手练习 —毕业设计

    商城后台系统 新手练习 毕业设计 业务功能介绍项目地址 xff1a 一 商品管理1 商品列表 描述 效果 2 添加商品 描述 效果 3 商品分类 描述 效果 4 商品类型 描述 效果 二 订单管理1 订单列表 描述 效果 2 订单设置 描述
  • CASE WHEN函数@sql学习

    mysql中可以使用CASE WHEN函数完成数据分组 CASE WHEN函数用来对数据进行判断和分组 来自MySQL触发器里的流程控制语句 知识 CASE WHEN是SQL编程中常用的条件控制语句 CASE WHEN的功能 xff1a 新