作为菜鸟初学者去面试时,总会遇到一些没见到过的面试题,总是拔凉拔凉的,赶紧去查了下大佬们怎么做的,然后自己尝试后在这里做个总结,记录自己不堪的经历
- 行转列问题,有表如下
现在希望把表的内容展示为:
书写语句如下`
SELECT user_name ,
MAX(CASE course WHEN '数学' THEN score ELSE 0 END ) 数学,
MAX(CASE course WHEN '语文' THEN score ELSE 0 END ) 语文,
MAX(CASE course WHEN '英语' THEN score ELSE 0 END ) 英语
FROM stu_grade
GROUP BY USER_NAME;
这里使用max()函数,是为了不让查询课程缺失时,出现null值,也可以使用sum()函数,查询结果也一样,语句如下:
SELECT user_name ,
SUM(CASE course WHEN '数学' THEN score ELSE 0 END ) 数学,
SUM(CASE course WHEN '语文' THEN score ELSE 0 END ) 语文,
SUM(CASE course WHEN '英语' THEN score ELSE 0 END ) 英语
FROM stu_grade
GROUP BY USER_NAME;
我也试了下不用MAX()或SUM()函数会出现的结果:
完全没查出想要的结果来… 除了数学这列,其余的语文,英语分数根本没对。
反复尝试了几次,发现是数学这列把后面语文英语的成绩置零了,下面这样写就没问题,也可以得到正确结果;
- 列转行的问题,跟刚才正好想法,我就不多贴图了,使用的建表语句与上面稍微不同,如下:
CREATE TABLE `stu_grade2` (
`ID` int(10) NOT NULL AUTO_INCREMENT,
`USER_NAME` varchar(20) DEFAULT NULL,
`CN_SCORE` float DEFAULT NULL,
`MATH_SCORE` float DEFAULT NULL,
`EN_SCORE` float DEFAULT '0',
PRIMARY KEY (`ID`)
)
查询语句使用了UNION ,将几条查询的结果作了合并,语句如下:
SELECT user_name, '语文' COURSE , CN_SCORE as SCORE from stu_grade2
UNION
SELECT user_name, '数学' COURSE, MATH_SCORE as SCORE from stu_grade2
UNION
SELECT user_name, '英语' COURSE, EN_SCORE as SCORE from stu_grade2
ORDER BY user_name,COURSE;
显示的查询结果为:
要想使成绩显示为优良中差不及格几等,可以使用如下语句:
SELECT user_name, '语文' COURSE ,
CASE WHEN CN_SCORE>=90 THEN '优'
WHEN CN_SCORE>=80 THEN '良'
WHEN CN_SCORE>=70 THEN '中'
WHEN CN_SCORE>=60 THEN '差'
ELSE '不及格' END
as SCORE from stu_grade2
UNION
SELECT user_name, '英语' COURSE ,
CASE WHEN EN_SCORE>=90 THEN '优'
WHEN EN_SCORE>=80 THEN '良'
WHEN EN_SCORE>=70 THEN '中'
WHEN EN_SCORE>=60 THEN '差'
ELSE '不及格' END
as SCORE from stu_grade2
UNION
SELECT user_name, '数学' COURSE ,
CASE WHEN MATH_SCORE >=90 THEN '优'
WHEN MATH_SCORE>=80 THEN '良'
WHEN MATH_SCORE>=70 THEN '中'
WHEN MATH_SCORE>=60 THEN '差'
ELSE '不及格' END
as SCORE from stu_grade2
展示结果为: