SQL Case when技巧 分阶段统计 二维表 分组汇总 等

Case when技巧

1. 概述

CASE表达式有简单CASE表达式(simple case expression)和搜索CASE表达式(searched
case expression)两种写法如下:
在这里插入图片描述
基本上采用搜索CASE表达式的写法
与DECODE函数等相比,CASE表达式的一大优势在于能够判断表达式。也就是说,在
CASE表达式里,我们可以使用BETWEEN、LIKE和<、>等便利的谓词组合,以及能嵌套
子查询的IN和EXISTS谓词。

2. 注意事项

注意事项1:统一各分支返回的数据类型
注意事项2:不要忘了写END
注意事项3:养成写ELSE子句的习惯

3. 示例

3.1分组汇总

在这里插入图片描述

SELECT
CASE
		pref_name 
		WHEN '德岛' THEN
		'四国' 
		WHEN '香川' THEN
		'四国' 
		WHEN '爱媛' THEN
		'四国' 
		WHEN '高知' THEN
		'四国' 
		
		WHEN '福冈' THEN
		'九州' 
		WHEN '佐贺' THEN
		'九州' 
		WHEN '长崎' THEN
		'九州' ELSE '其他' 
	END AS district, SUM ( population ) 
FROM
	PopTbl 
GROUP BY
CASE
		pref_name 
		WHEN '德岛' THEN
		'四国' 
		WHEN '香川' THEN
		'四国' 
		WHEN '爱媛' THEN
		'四国' 
		WHEN '高知' THEN
		'四国' 
		
		WHEN '福冈' THEN
		'九州' 
		WHEN '佐贺' THEN
		'九州' 
		WHEN '长崎' THEN
		'九州' ELSE '其他' END;
3.2分阶段统计

统计结果:
统计结果:

SELECT CASE
 WHEN [年龄] < 20 THEN
 '<20'
 WHEN 年龄 > 20 THEN
 '>20'
 ELSE
 '其他'
 END ,
 COUNT(姓名)
FROM dbo.hr_data
GROUP BY CASE
 WHEN 年龄 < 20 THEN
 '<20'
 WHEN 年龄 > 20 THEN
 '>20'
 ELSE
 '其他'
 END;
3.3 二维表统计

统计结果:
在这里插入图片描述

SELECT [用工关系],
 SUM( CASE
 WHEN [性别] = '男' THEN
 1
 ELSE
 0
 END
 ) AS '男人数量',
 SUM( CASE
 WHEN [性别] = '女' THEN
 1
 ELSE
 0
 END
 ) AS '女人数量'
FROM hr_data
GROUP BY [用工关系];
3.4定义蕴含条件的约束
CONSTRAINT check_salary CHECK
(CASE WHEN sex ='2'
			THEN CASE WHEN salary <= 200000
					THEN 1 ELSE 0 END
			ELSE 1 END = 1 )

说明:在性别为女时,拒绝薪资高于200000的员工

3.5 case 中查询另一张表

在这里插入图片描述

SELECT course_name,
 CASE
	 WHEN EXISTS
	 (
	 SELECT dbo.openCourse.id
	 FROM dbo.openCourse
	 WHERE dbo.openCourse.mon = '一月'
	 AND dbo.openCourse.courseId = dbo.course.id
	 ) THEN
	 'O'
	 ELSE
	 'x'
	 END AS '一月',
 CASE
	 WHEN EXISTS
	 (
	 SELECT dbo.openCourse.id
	 FROM dbo.openCourse
	 WHERE dbo.openCourse.mon = '二月'
	 AND dbo.openCourse.courseId = dbo.course.id
	 ) THEN
	 'O'
	 ELSE
	 'x'
	 END AS '二月',
 CASE
	 WHEN EXISTS
	 (
	 SELECT dbo.openCourse.id
	 FROM dbo.openCourse
	 WHERE dbo.openCourse.mon = '三月'
	 AND dbo.openCourse.courseId = dbo.course.id
	 ) THEN
	 'O'
	 ELSE
	 'x'
	 END AS '三月'
FROM dbo.course;

说明:利用case 联查了相关表 没有用left join
无论使用IN还是EXISTS,得到的结果是一样的,但从性能方面来说,EXISTS更
好。通过EXISTS进行的子查询能够用到“month, course_id”这样的主键索引

3.6 case 中使用聚合函数

需求:找出主社团,只有一个社团的,社团id就是唯一社团的id,加入多个社团
的看主社团标记
源数据:
在这里插入图片描述
说明:有的学生只加入了某一个社团(如学号为300、400、500的学
生)。对于加入了多个社团的学生,我们通过将其“主社团标志”列设置为Y
或者N来表明哪一个社团是他的主社团;对于只加入了一个社团的学生,
我们将其“主社团标志”列设置为N。

统计结果:
在这里插入图片描述

SELECT std_id,
	CASE WHEN COUNT(*) =1 --只加入了一个社团的学生
		THEN MAX(club_id)
		ELSE MAX(CASE WHEN main_club_flg ='Y'
												THEN club_id
												ELSE NULL END)
	END AS main_club
FROM StudentClub
GROUP BY std_id;

建立运行环境-Excel Vba,可移植到VB环境中(需修改一些代码) '仿制简单的SQL查询语句,用于对二维数组的查询 '参照SQL语句:Select * From array [Where conditions] [Distinct fields] [ResultWithTitle] ' '实现功能: ' 依条件设置查询数组,返回包含查询字段(或全部字段)的数组,可多条件组合。 ' 条件运算符包括:> = < >= <= <> , like(正则达式) ' '附注: ' 使用此函数,需要在文件中引用正则达式脚本 Microsoft VBScript Regular Expressions x.x ' (根据不同的电脑配置和环境此处会有差异) '算法简要: ' 1、查询条件运算符:仅有 >, =, <, >=, <=, <> , like(正则达式) ' 本函数中仅有上述运算符。原因在于,更多的运算符编制逻辑过于复杂,又不太常用。 ' 为了尽可能多地容纳各种运算关系,添加了正则达式匹配运算, ' 在某个单一条件中,正则几乎可以容纳绝大部分的比对运算关系了。 ' 2、数字比较: ' 采用了将数字型字符串类型转换为数字之后再比较的方法,结果更为准确。 ' 3、其他算法和运算速度: ' 编制过程中,试验过使用 正则+逻辑分支+达式引用 的方法, ' 可以实现几乎等同于SQL查询语句的复杂功能,而且代码更简捷。 ' 但运算速度相差过于悬殊(大概几十到上百倍 - "一闪而过"和"一袋烟"的差距!),最后不得不放弃。 ' 所以现在的版本相当于一个简化了的select语句,但对于大多数查询情况而言够用了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值