面试的时候总会遇到这样那样的问题,
数据库更是一个必不可少的问题。
今天给大家分享一道数据库方面的面试题!
题目如下:
已知一数据表aa,内容与格式如下:
写一个sql,按照格式输出下列内容:
……………………………………………………
下面我们来一起看一下这道题应该怎么去做。
首先,我们先想到的是统计和分组,写出来的sql如下:
select rq, shengfu, count(shengfu) from aa group by rq,shengfu;
但是,运行结果却差强人意。
这个时候,需要运用到另外一个sql中的知识点了。
这个知识点是什么呢?
就是行转列!
Mysql中,行转列有很多种方法,
其中一种,就是用SUM函数,结合case语句组合来完成。
就比如我们现在的这道面试题,
我们就可以这样来写。
select rq,sum(CASE shengfu WHEN '胜' THEN 1
ELSE 0 END ) '胜',sum(CASE shengfu
WHEN '负' THEN 1 ELSE 0 END ) '负'
from aa GROUP BY rq;
执行结果如下:
这个sql如何解释呢?
首先,我们显示的胜负,是要统计出他的个数
我们这里选择了sum函数。
然后选择的case when then来组合
表达式的格式如下:
case colume
when condition
then result
else result
end
代入我们前面的sql中,就可以这样理解:
当shengfu字段的值,等于“胜”,变为1,如果不等于“胜”那么给0。
所以,整个括号里面的内容,就是把所有的“胜”变为1,则求和SUM出来的结果,就是胜的数量统计。
负的计算方式一样。
这样就可以实现我们所要查询显示的结果了。
关于case,给大家说明一下,
简单case函数是case搜索函数的真子集
简单case函数的使用方法与一些高级语言(如:java)中的switch语句相似:CASE给定匹配字段,WHEN给出具体的字段值,如果匹配到后返回THEN值。
简单case函数其实就是case搜索函数的‘=’逻辑的实现。case搜索函数可以实现简单case函数的所有功能,而简单case函数却不可实现case搜索函数的‘=’逻辑以外的功能。
case函数匹配原则
case函数与switch的不同在于case仅返回第一个匹配到的结果,而
switch则会在没有中断的情况下继续后面的判断,将会执行所有匹配的结果。
case搜索函数比简单case函数更加灵活
case搜索函数与简单case函数相比的灵活之处在于可以在WHEN中书写判断式。
关于case在sql中的妙用,大家可以移步https://blog.csdn.net/wuzuodingfeng/article/details/53523176
去详细了解一下case。