这篇博文是博主大学室友在群里面问的一个问题,问题如下:
统计一个学校不同年级不同班级里大于10岁和小于10岁的人数?
显示如: 一年级/一班/大于10岁的人数/小于10岁的人数
二年级/一班/大于10岁的人数/小于10岁的人数
下面我先建一个基础信息表,方便读者理解这个问题,建表sql如下:
create database sql_client;
use sql_client;
create table student(
id int AUTO_INCREMENT primary key,
name varchar(255),
age int,
grade int,
class int
);
insert into student(name, age, grade, class) values ('a',10,1,1),('b',11,1,1),('c',12,2,1),('d',20,2,1),('e',21,3,1),('f',22,2,1),('g',23,1,1),('h',30,3,1);
复制代码
上面我们建立了一个学生表,有id,姓名,年龄,年级,班级字段,插入数据如下:
这里学生年龄有3个类别,分别为10-20,20-30,30-…,所以我们先根据年龄类别打标:
select age,grade,class,
case when age>=10 and age <20 then 'low'
when age >=20 and age <30 then 'mid'
else 'high' end
category
from student
复制代码
打标后数据如下:
按照一开始提出的业务需求,是想要将年龄低中高三个类别作为列显示,上面我们打标后是行,所以接下来需要一个列转行的操作
select grade,class,
ifnull(sum(if(category='low',1,0)),0)low,
ifnull(sum(if(category='mid',1,0)),0)mid,
ifnull(sum(if(category='high',1,0)),0)high
from(
select age,grade,class,case when age>=10 and age <20 then 'low' when age >=20 and age <30 then 'mid' else 'high' end category
from student)t group by grade,class;
复制代码
执行完上述sql后,即可得到满足问题的答案:
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END