SQL数据分析day2

一、CASE表达式

1.简单表达式和搜索表达式

类似功能:DECODE(Oracle)、IF (MySQL)
分为简单CASE表达式和搜索CASE表达式

--简单CASE表达式和搜索CASE表达式
--simple case expression
case sex
	when '1' then 'man'
	when '2' then 'woman'
else 'else' end
--searched case expression
case when sex = '1' then 'man'
	 when sex = '2' then 'woman'
else 'else' end 

执行结果相同,搜索表达式实现范围较大,一般使用搜索表达式
注:发现为真的when子句时,CASE表达式的真假值判断会中止,剩余的when子句会被忽略,
注意when子句的排他性

--when子句被忽略的写法(不论输入值是a或b,都是frist)
case when col_1 in ('a', 'b') then 'frist'
	 when col_2 in ('a') then 'second'
else 'else' end

2.将已有编号方式转换为新的方式并统计

在进行非定制化统计时,我们经常会遇到将已有编号方式转换为另外一种便于分析的方式并进行统计的需求。
例如,现在有一张按照“‘1:北海道’、‘2:青森’、……、‘47:冲绳’”这种编号方式来统计都道府县 2 人口的表,我们需要以东北、关东、九州等地区为单位来分组,并统计人口数量。具体来说,就是统计下表 PopTbl 中的内容,得出如右表“统计结果”所示的结果。

在这里插入图片描述

--使用case表达式
select case pref_name
	   when '德岛' then '四国'
	   when '香川' then '四国'
	   when '爱媛' then '四国'
	   when '高知' then '四国'
	   when '福冈' then '九州'
	   when '佐贺' then '九州'
	   when '长崎' then '九州'
	else 'else' end as district,
	sum(population)
from popTbl
group by7 case pref_name
	   when '德岛' then '四国'
	   when '香川' then '四国'
	   when '爱媛' then '四国'
	   when '高知' then '四国'
	   when '福冈' then '九州'
	   when '佐贺' then '九州'
	   when '长崎' then '九州'
	   else 'else' end

如果对转换前的列“pref_name ”进行 GROUP BY ,就得不到正确的结果
要按人口数量等级(pop_class )查询都道府县个数的时候,就可以像下面这样写 SQL 语句。

-- 按人口数量等级划分都道府县
SELECT CASE WHEN population < 100 THEN '01'
			WHEN population >= 100 AND population < 200 THEN '02'
			WHEN population >= 200 AND population < 300 THEN '03'
			WHEN population >= 300 THEN '04'
			ELSE NULL END AS pop_class,
COUNT(*) AS cnt
FROM PopTbl
GROUP BY CASE WHEN population < 100 THEN '01'
			  WHEN population >= 100 AND population < 200 THEN '02'
			  WHEN population >= 200 AND population < 300 THEN '03'
			  WHEN population >= 300 THEN '04'
ELSE NULL END;
--结果
pop_class cnt
--------- ----
01 1
02 3
03 3
04 2

必须在 SELECT 子句和 GROUP BY 子句这两处写一样的 CASE 表达式较为麻烦,可更改为下述写法
但是严格来说,这种写法是违反标准 SQL 的规则的。
GROUP BY 子句比 SELECT 语句先执行,在 GROUP BY 子句中引用在 SELECT 子句里定义的别称不被允许
在 Oracle、DB2、SQL Server 等数据库里采用这种写法时就会出错。
在 PostgreSQL 和MySQL 中,这个查询语句就可以顺利执行。

-- 把县编号转换成地区编号(2) :将CASE 表达式归纳到一处
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 district;-------GROUP BY 子句里引用了SELECT 子句中定义的别名

3.用一条 SQL 语句进行不同条件的统计

进行不同条件的统计是 CASE 表达式的著名用法之一。
例如,我们需要往存储各县人口数量的表 PopTbl 里添加上“性别”列,然后求按性别、县名汇总的人数。具体来说,就是统计表 PopTbl2 中的数据,然后求出如表“统计结果”所示的结果。

在这里插入图片描述

SELECT pref_name,
-- 男性人口
SU
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值