sql如何让计算出来的结果百分数显示_图解面试题:如何交换数据?
![](/assets/blank.gif)
【题目】
小明是一所学校的老师,她有一张 ‘学生表’,平时用来存放座位号和学生的信息。其中,座位号是连续递增的。总的座位数是偶数。
![](/assets/blank.gif)
现在,小明想改变相邻俩学生的座位。你能不能帮她写一个sql查来输出想要的结果呢?
示例查询结果如下:
![](/assets/blank.gif)
【解题思路】
第1步:理清换座位的逻辑
查询目的是改变相邻学生的座位号。为了理清逻辑,在原表中插入一列叫做‘奇偶数’,对应表示“座位号”的值是“奇数”还是“偶数”。
![](/assets/blank.gif)
然后比较原始表里的“座位号”和交换结果里的“座位号”(对比分析方法),可以发现下图的规律。
![](/assets/blank.gif)
1)如果原来座位号是奇数的学生,换座位后,这名学生的座位号变为“座位号+1”。
2)如果原来座位号是偶数的学生,换座位后,这名学生的座位号变为“座位号-1”。
第2步:如何判断座位号是奇数,还是偶数
sql求余函数:mod(n,m) ,返回n除以m的余数。比如mod(8,2) 的结果是0。
如果n除以2的余数是0,说明n是偶数,否则是奇数。
转换为判断奇数,偶数的sql就是:
casewhen mod(座位号, 2) != 0 then '奇数'when mod(座位号, 2) = 0 then '偶数'
end
把前面的逻辑加入上面这个sql里就是:
1)如果原来座位号是奇数的学生,换座位后,这名学生的座位号变为“座位号+1”
2)如果原来座位号是偶数的学生,换座位后,这名学生的座位号变为“座位号-1”
casewhen mod(座位号, 2) != 0 then 座位号 + 1when mod(座位号, 2) = 0 then 座位号 - 1
end as '交换后座位号'
第3步:对查询结果排序
因为查询结果里座位号是升序排列的,所以最后还要排序(order by 座位号 asc)。
加入select子句,最终sql如下:
select(casewhen mod(座位号, 2) != 0 then 座位号 + 1when mod(座位号, 2) = 0 then 座位号 - 1end) as '交换后座位号',姓名
from 学生表
order by 座位号 asc;
【本题考点】
1.逻辑思维能力,如何使用对比分析方法发现规律
2.条件判断语句case
3.如何判断奇数和偶数:mod函数
【举一反三】
原始座次表 ‘seat’如下,现需要更换相邻位置学生的座次。
注:该座次表‘seat’共有5名学生,第5个 奇偶性为奇数的学生座次为不变
![](/assets/blank.gif)
查询逻辑和前面一样,但是座位总数是奇数,所以:如果最后一个座位号也是奇数,那么他没有可以交换的座位了,所以最后一个座位号的学生不变。
最后一个座位号,等于表里有多少行,可以用count(*) 计算出来
# 最后一个座位号
select count(*) as counts
from seat;
最后一个座位号作为条件判断使用时,可以使用子查询,以便调用。最终sql如下。
select(case# 当座位号是奇数并且不是不是最后一个座位号时when mod(id, 2) != 0 and counts!= id then id + 1# 当座位号是奇数并且是最后一个座位号时,座位号不变when mod(id, 2) != 0 and counts = id then id# 当座位号是偶数时else id - 1end) as id2,student
from seat,(select count(*) as counts from seat) as b
order by id asc;
推荐:如何从零学会sql?
![](/assets/blank.gif)
sql如何让计算出来的结果百分数显示_图解面试题:如何交换数据?相关推荐
- sql 大于某个日期_图解面试题:如何比较日期数据?
[题目] 下面是某公司每天的营业额,表名为"日销"."日期"这一列的数据类型是日期类型(date). 请找出所有比前一天(昨天)营业额更高的数据.(前一天的意思 ...
- sql 列求和_图解面试题:累计求和问题如何分析?
[题目] "薪水表"中记录了员工发放的薪水.包含雇员编号,薪水.起始日期.结束日期. 其中,薪水是指该雇员在起始日期到结束日期这段时间内的薪水.当前员工是指结束日期 = '9999 ...
- sql server 中获取前一天日期_图解面试题:如何比较日期数据?
[题目] 下面是某公司每天的营业额,表名为"日销"."日期"这一列的数据类型是日期类型(date). 请找出所有比前一天(昨天)营业额更高的数据.(前一天的意 ...
- call 存储过程时必须声明表示符_图解面试题:SQL存储过程有什么用?
面试中有时候会问:存储过程有什么用?看了今天的知识,你就知道如何回答了. 1.存储过程是什么? 假如你每天要开车完成一些列重复的操作:车钥匙启动车,倒车.现在出现了一款新车,可以自动的完成这些重复的工 ...
- java计算两个数组的交集_回顾面试题:计算两个数组交集
背景 工作多年,语言经历过C#,JAVA.但是做过的项目大多以业务系统为主,曾经做过一些基础架构的工作,但算法一直在工作中应用的比较少,导致多年之后基本都忘记完了.上一次面试过程中就有一个算法题,我能 ...
- PGSQL-通过SQL语句来计算两个日期相差的天数
转自:https://www.cnblogs.com/chenglang/p/9843932.html 这是本人第一次写的~我在某次需求中遇到一个问题,如何在SQL语句中计算出两个日期的天数,然后用 ...
- sql 占比计算_数据库索引的优化及SQL处理过程(建议收藏)
想要设计出好的索引,首先必须了解SQL语句在数据库服务器中的处理过程,本文介绍 数据库索引设计与优化 中几个对索引优化非常重要的概念. 谓词 谓词就是条件表达式. SQL语句的where子句由一个或者 ...
- SQL语句中计算百分比
SQL语句中计算百分比 A.TOTAL_COUNT TOTALCOUNT, A..QUES_COUNT QUESCOUNT, CASE WHEN TOTAL_COUNT = QUES_ ...
- SQL根据出生日期计算年龄的两种算法
--Sql根据出生日期计算年龄 1. select datediff(year,EMP_BIRTHDAY,getdate()) as '年龄' from EMPLOYEEUnChangeInfo ...
最新文章
- matlab小技巧与verilog小技巧
- 【gitlab】gitlab快速部署教程
- The 'microsoft.jet.oledb.4.0' provider is not registered on the local machin
- 用Keil-MDK开发TQ2440裸机程序入门教程——LED流水灯实现
- request_irq与request_threaded_irq
- 解决NION‘. Failed rule: ‘orderByClause clusterByClause distributeByClause sortByClause limitClause can
- js $.inArray
- 在GitHub里生成自己的网页
- UNIX/Linux RHEL6.3 root密码破解,GRUB加密(图文并茂)
- 考研英语到底该如何复习?
- 电力设备巡检解决方案
- 脚下,梦开始的地方——七月总结
- adobe xd_如何在Adobe XD中创建Finance App UI设计
- 【window】解决word,excel,PowerPoint 等office图标不显示问题
- 【C++】「一本通 1.1 例 4」加工生产调度
- 漳州市计算机报名时间,漳州市计算机操作员证怎么考要什么条件考试需要多久...
- Android ExpandableListView 使用实例
- 多台S7-200Smart之间无线通讯例程
- php处理jpg图片背景色,将白色处理为透明色
- 私企做阿米巴经营模式失败的原因——灵魂5问!