SQL中case when then else end用法实例
一、阐述
case when then else end 可以理解为java的if-else if -else。可以理解为流程控制语句或条件控制语句。可以实现资料获取的时候,可以更多的条件和自定义逻辑。
适用情景
- 对已知的数据库中数据,按照自己的逻辑,进行自定义分组和数据分析
- 用此条件控制语句,实现自定义条件分组
- 条件控制语句中嵌套函数达到理想的计算效果
二、具体使用
1.已知数据按照另外一种方式进行分组,分析。
有如下数据:(为了看得更清楚,我并没有使用国家代码,而是直接用国家名作为primary key)
国家(country) | 人口(population) |
中国 | 600 |
美国 | 100 |
加拿大 | 100 |
英国 | 200 |
法国 | 300 |
日本 | 250 |
德国 | 200 |
墨西哥 | 50 |
印度 | 250 |
根据这个国家人口数据,统计亚洲和北美洲的人口数量。应该得到下面这个结果。
洲 | 人口 |
亚洲 | 1100 |
北美洲 | 250 |
其他 | 700 |
想要解决这个问题,假如使用case函数,sql代码如下:
select sum(population),
case country
when '中国' then'亚洲'
when '印度' then'亚洲'
when '日本' then'亚洲'
when '美国' then'北美洲'
when '加拿大' then'北美洲'
when '墨西哥' then'北美洲'
else '其他' end
from table_a
group by case country
when '中国' then'亚洲'
when '印度' then'亚洲'
when '日本' then'亚洲'
when '美国' then'北美洲'
when '加拿大' then'北美洲'
when '墨西哥' then'北美洲'
else '其他' end;
2.用一个sql语句完成不同条件的分组。
有如下数据
国家(country) | 性别(sex) | 人口(population) |
中国 | 1 | 340 |
中国 | 2 | 260 |
美国 | 1 | 45 |
美国 | 2 | 55 |
加拿大 | 1 | 51 |
加拿大 | 2 | 49 |
英国 | 1 | 40 |
英国 | 2 | 60 |
按照国家和性别进行分组,得出结果如下
国家 | 男 | 女 |
中国 | 340 | 260 |
美国 | 45 | 55 |
加拿大 | 51 | 49 |
英国 | 40 | 60 |
普通情况下,用union也可以实现用一条语句进行查询。但是那样增加消耗(两个select部分),而且sql语句会比较长。
下面是一个是用case函数来完成这个功能的例子
select country,
sum( case when sex = '1' then
population else 0 end), --男性人口
sum( case when sex = '2' then
population else 0 end) --女性人口
from table_a
group by country;
这样我们使用select,完成对二维表的输出形式,充分显示了case函数的强大。
补充:对case when 的理解总结
1、then和else后,只能写一条输出语句且输出结果就是新生成列的值;when 后的条件判断可以有多条,且可以多个字段联合判断;end 后的输出也可以有多条,但必须有一个是新生成列的字段名; [常规用法:select 后到from前,直接使用case when] (例1)
2、when 后多条件判断用and连接(例3)
3、case when 巧妙用法 [order by 后用case when] [count()中用case when] (例2)
4、group by 后用case when (在参考里)
5、case when,如果有多个,如果一条记录满足第一个case when就不会再去执行后面的case when,所以要想保证某个case when一定执行,就把她写在最前面。
总结
到此这篇关于SQL中case when then else end用法的文章就介绍到这了,更多相关SQL case when then else end用法内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341