mysql 多条件分支 统计 极简sql

这篇博文是博主大学室友在群里面问的一个问题,问题如下:

统计一个学校不同年级不同班级里大于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后,即可得到满足问题的答案:
在这里插入图片描述

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值