由于之前的工作离家太远,一年回家也就两次,对于一个看重家庭的男人,过了年关之后,想找一个离家近的工作。于是,我和成千上万急忙找工作的人一样,在网上投些自己比较满意的公司,然后等待信息--通知面试--面试。几天之内,面试了好几家,心情是五味杂陈,我相信就算一个工作经验丰富的去面试也会碰到自己难以回答、或者回答不是很满意的技术问题。
今天我去一家技术公司面试,当时一个小房间除了我和面试官,其中,那个面试官打通了在深圳的同事,通过聊天,我感觉他绝对是一个很有工作经验的人物。那个电话里头的面试官问我好多问题--比如:ArrayList和LinkedList的区别、==和equals的区别、堆和栈的区别、SpringMVC的流程、Mybatis框架中mapper.xml里面常用的关键词、怎么获取input标签里面的属性、锁机制等等,我回答的都比较不错,最后问我你的sql语句怎么样,我很有自信的说-可以,然后他发过来一道题,看到之后有点紧张了,自己思考之后写了出来,但是感觉不对,那个面试官对我说你sql语句写的不对,到最后我问了些问题,就回去了,心想肯定没戏。
这道题是这样的
name | subject | score |
张三 | 语文 | 90 |
张三 | 数学 | 70 |
张三 | 英语 | 60 |
李四 | 语文 | 80 |
李四 | 数学 | 75 |
李四 | 英语 | 85 |
sql语句执行之后,结果如下:
name | 语文 | 数学 | 英语 |
张三 | 90 | 70 | 60 |
李四 | 80 | 75 | 85 |
在回家的路上,我一直再考虑这个问题,也深深自责,功亏一篑,但是疼定思痛,回来自己专门新建一个数据库表,自己写一下自己的语句,还真是错误的。然后,百度一下,才知道这是考察的sql语句中的行转列!!!!!!!!!!!!
在sqlServer中可以使用PIVOT关键字进行行转列
Mysql语句中需要使用case when关键字
第一步:case when 函数输出单个课程的成绩,结果如下:
sql语句:
SELECT name,
CASE WHEN subject='语文' THEN score END as 语文,
CASE WHEN subject='数学' THEN score END as 数学,
CASE WHEN subject='英语' THEN score END as 英语
FROM test;
第二步:使用group by和sum去掉null 得出最后的成绩
sql语句:
SELECT name,
SUM(CASE WHEN subject='语文' THEN score END) as 语文,
SUM(CASE WHEN subject='数学' THEN score END) as 数学,
SUM(CASE WHEN subject='英语' THEN score END) as 英语
FROM test GROUP BY name;
结果为:
给他家留下一个悬念:当我使用其他聚合函数如:max()、avg()函数都可以得到同样的情况,而count()不可以,是什么原因?