【题目】

小明是一所学校的老师,她有一张 ‘学生表’,平时用来存放座位号和学生的信息。其中,座位号是连续递增的。总的座位数是偶数。

现在,小明想改变相邻俩学生的座位。你能不能帮她写一个sql查来输出想要的结果呢?

示例查询结果如下:

【解题思路】

第1步:理清换座位的逻辑

查询目的是改变相邻学生的座位号。为了理清逻辑,在原表中插入一列叫做‘奇偶数’,对应表示“座位号”的值是“奇数”还是“偶数”。

然后比较原始表里的“座位号”和交换结果里的“座位号”(对比分析方法),可以发现下图的规律。

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个 奇偶性为奇数的学生座次为不变

查询逻辑和前面一样,但是座位总数是奇数,所以:如果最后一个座位号也是奇数,那么他没有可以交换的座位了,所以最后一个座位号的学生不变。

最后一个座位号,等于表里有多少行,可以用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?

sql如何让计算出来的结果百分数显示_图解面试题:如何交换数据?相关推荐

  1. sql 大于某个日期_图解面试题:如何比较日期数据?

    [题目] 下面是某公司每天的营业额,表名为"日销"."日期"这一列的数据类型是日期类型(date). 请找出所有比前一天(昨天)营业额更高的数据.(前一天的意思 ...

  2. sql 列求和_图解面试题:累计求和问题如何分析?

    [题目] "薪水表"中记录了员工发放的薪水.包含雇员编号,薪水.起始日期.结束日期. 其中,薪水是指该雇员在起始日期到结束日期这段时间内的薪水.当前员工是指结束日期 = '9999 ...

  3. sql server 中获取前一天日期_图解面试题:如何比较日期数据?

    ​[题目] 下面是某公司每天的营业额,表名为"日销"."日期"这一列的数据类型是日期类型(date). 请找出所有比前一天(昨天)营业额更高的数据.(前一天的意 ...

  4. call 存储过程时必须声明表示符_图解面试题:SQL存储过程有什么用?

    面试中有时候会问:存储过程有什么用?看了今天的知识,你就知道如何回答了. 1.存储过程是什么? 假如你每天要开车完成一些列重复的操作:车钥匙启动车,倒车.现在出现了一款新车,可以自动的完成这些重复的工 ...

  5. java计算两个数组的交集_回顾面试题:计算两个数组交集

    背景 工作多年,语言经历过C#,JAVA.但是做过的项目大多以业务系统为主,曾经做过一些基础架构的工作,但算法一直在工作中应用的比较少,导致多年之后基本都忘记完了.上一次面试过程中就有一个算法题,我能 ...

  6. PGSQL-通过SQL语句来计算两个日期相差的天数

     转自:https://www.cnblogs.com/chenglang/p/9843932.html 这是本人第一次写的~我在某次需求中遇到一个问题,如何在SQL语句中计算出两个日期的天数,然后用 ...

  7. sql 占比计算_数据库索引的优化及SQL处理过程(建议收藏)

    想要设计出好的索引,首先必须了解SQL语句在数据库服务器中的处理过程,本文介绍 数据库索引设计与优化 中几个对索引优化非常重要的概念. 谓词 谓词就是条件表达式. SQL语句的where子句由一个或者 ...

  8. SQL语句中计算百分比

    SQL语句中计算百分比  A.TOTAL_COUNT TOTALCOUNT,    A..QUES_COUNT  QUESCOUNT,    CASE WHEN TOTAL_COUNT = QUES_ ...

  9. SQL根据出生日期计算年龄的两种算法

    --Sql根据出生日期计算年龄 1.  select datediff(year,EMP_BIRTHDAY,getdate()) as '年龄' from  EMPLOYEEUnChangeInfo ...

最新文章

  1. matlab小技巧与verilog小技巧
  2. 【gitlab】gitlab快速部署教程
  3. The 'microsoft.jet.oledb.4.0' provider is not registered on the local machin
  4. 用Keil-MDK开发TQ2440裸机程序入门教程——LED流水灯实现
  5. request_irq与request_threaded_irq
  6. 解决NION‘. Failed rule: ‘orderByClause clusterByClause distributeByClause sortByClause limitClause can
  7. js $.inArray
  8. 在GitHub里生成自己的网页
  9. UNIX/Linux RHEL6.3 root密码破解,GRUB加密(图文并茂)
  10. 考研英语到底该如何复习?
  11. 电力设备巡检解决方案
  12. 脚下,梦开始的地方——七月总结
  13. adobe xd_如何在Adobe XD中创建Finance App UI设计
  14. 【window】解决word,excel,PowerPoint 等office图标不显示问题
  15. 【C++】「一本通 1.1 例 4」加工生产调度
  16. 漳州市计算机报名时间,漳州市计算机操作员证怎么考要什么条件考试需要多久...
  17. Android ExpandableListView 使用实例
  18. 多台S7-200Smart之间无线通讯例程
  19. php处理jpg图片背景色,将白色处理为透明色
  20. 私企做阿米巴经营模式失败的原因——灵魂5问!

热门文章

  1. 【Springboot】日志
  2. 面试常碰到++p/p--问题到底结果是什么?
  3. Python怎么利用多核cpu
  4. LED芯片,应用品,蓝宝石衬底,集成电路,UV
  5. AIFramework框架Jittor特性(上)
  6. 在React Hook里使用history.push跳转
  7. 我的世界javamod怎么装_易拉罐装的葡萄酒你们能接受吗?
  8. Can't toast on a thread that has not called Looper.prepare()
  9. P2245 星际导航
  10. tar 和gzip 的区别