SQL计算出每年在校人数

文章提供了一个SQL查询示例,用于计算每年的在校学生人数。通过创建测试表并插入数据,然后使用两种不同的SQL查询方法,包括笛卡尔积和JOIN操作,来统计每个学年的学生总数。这些查询考虑了学生的入学年份和学制长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下是一个录取学生人数表的示例,记录了每年录取学生的人数和入学学制。 

idyearnumstu_len
120181013
220191214
32020912
420211513
520211412
620221613

字段解释:

  • id:记录的唯一标识符
  • year:学生入学年度
  • num:对应年度录取的学生人数
  • stu_len:录取学生的学制

    举例说明:例如,录取年度为2018的学制为3,表示这批学生在校的学习时间为20182019、20192020、2020~2021三个学年。

根据以上示例计算出每年在校人数,写出SQL语句: 

1、数据准备

CREATE TABLE `test01` (
                         `id` int(11) NOT NULL AUTO_INCREMENT,
                         `year` int(255) DEFAULT NULL COMMENT '入学年度',
                         `num` int(255) DEFAULT NULL COMMENT '录取学生人数',
                         `stu_len` varchar(255) DEFAULT NULL COMMENT '学生学制',
                         PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COMMENT='录取人数';

INSERT INTO `test01` (`year`, `num`, `stu_len`) VALUES
                                                   (2018, 101, '3'),
                                                   (2019, 121, '4'),
                                                   (2020, 91, '2'),
                                                   (2021, 151, '3'),
                                                   (2021, 141, '2'),
                                                   (2022, 161, '3');

2、sql

思路1(笛卡尔积,性能较差):

select t_year.year,
       -- sum() 就是一个累加的过程(累加器),如果为true就执行sum+num,为false就执行sum+0
       sum(case when t_admit.start<=t_year.year and t_year.year<t_admit.end THEN num else 0 end ) stu_sum
from
    (select distinct year from test01) as t_year,
    (select id, num, year as start, year+stu_len as end from test01) as t_admit
GROUP BY t_year.year;

 思路2:

SELECT t_year.year, SUM(t_admit.num) AS stu_sum
FROM (
    SELECT DISTINCT year
    FROM test01
) AS t_year
JOIN test01 AS t_admit ON t_year.year BETWEEN t_admit.year AND t_admit.year + t_admit.stu_len - 1
GROUP BY t_year.year;

explain查看执行计划:


 

3、运行效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

重生之我又是程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值