牛客SQL.1.26

141 阅读2分钟

「这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战

描述

题目:现在运营想要将用户划分为25岁以下和25岁及以上两个年龄段,分别查看这两个年龄段用户数量

本题注意:age为null 也记为 25岁以下

示例:user_profile

img

根据示例,你的查询应返回以下结果:

img

示例1

drop table if exists `user_profile`;
drop table if  exists `question_practice_detail`;
CREATE TABLE `user_profile` (
`id` int NOT NULL,
`device_id` int NOT NULL,
`gender` varchar(14) NOT NULL,
`age` int ,
`university` varchar(32) NOT NULL,
`gpa` float,
`active_days_within_30` int ,
`question_cnt` int ,
`answer_cnt` int 
);
CREATE TABLE `question_practice_detail` (
`id` int NOT NULL,
`device_id` int NOT NULL,
`question_id`int NOT NULL,
`result` varchar(32) NOT NULL
);
CREATE TABLE `question_detail` (
`id` int NOT NULL,
`question_id`int NOT NULL,
`difficult_level` varchar(32) NOT NULL
);
​
INSERT INTO user_profile VALUES(1,2138,'male',21,'北京大学',3.4,7,2,12);
INSERT INTO user_profile VALUES(2,3214,'male',null,'复旦大学',4.0,15,5,25);
INSERT INTO user_profile VALUES(3,6543,'female',20,'北京大学',3.2,12,3,30);
...
INSERT INTO question_practice_detail VALUES(4,6543,111,'right');
INSERT INTO question_practice_detail VALUES(1,2138,111,'wrong');
INSERT INTO question_practice_detail VALUES(22,2131,113,'right');
INSERT INTO question_practice_detail VALUES(23,5432,113,'wrong');
...
INSERT INTO question_detail VALUES(4,115,'easy');
INSERT INTO question_detail VALUES(5,116,'medium');
INSERT INTO question_detail VALUES(6,117,'easy');
25岁以下|4
25岁及以上|3

方法一

根据题中给出的结果图,我们可以发现对于user_profile表中并没有age_cut字段,且该字段下的值同样也没有,所以这需要我们自己在SELECT语句中将这些自定义的值返回;具体的做法就是,在SELECT语句中使用IF条件来判断,当前该条记录的age字段的值是否大于等于25,如果是返回值为25岁及以上,否则为25岁以下SELECT IF(age >= 25, "25岁及以上", "25岁以下") AS age_cut FROM user_profile;最后,将这条语句的返回结果集作为表用来查询,以age_cut分组,统计各组的数量即可;SQL语句如下:

SELECT age_cut, count(*)
FROM (SELECT IF(age >= 25, "25岁及以上", "25岁以下") AS age_cut FROM user_profile) T
GROUP BY age_cut;