面试题精选 —— 数据库统计

面试的时候总会遇到这样那样的问题,

 

数据库更是一个必不可少的问题。

 

今天给大家分享一道数据库方面的面试题!

 

题目如下:

 

已知一数据表aa,内容与格式如下:

 

面试题精选 —— 数据库统计

 

 

写一个sql,按照格式输出下列内容:

 

 

面试题精选 —— 数据库统计

 

……………………………………………………

 

下面我们来一起看一下这道题应该怎么去做。

 

首先,我们先想到的是统计和分组,写出来的sql如下:

 

select rqshengfu, count(shengfufrom 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。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpjpsx.html