如何使用sql根据学生的学制统计每年的学生人数

1.有一个录取学生人数表,记录的是每年录取学生人数和入学学生的学制
以下是表结构:

CREATE TABLE `admit` (
  `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='录取人数';

year表示学生入学年度
num表示对应年度录取学生人数
stu_len表示录取学生的学制
说明:例如录取年度2018学制3,表示该批学生在校年份为2018 ~ 2019、2019 ~ 2020、2020 ~ 2021
以下是示例数据:

idyearnumstu_len
1201820003
2201920003
3202010004
4202020003

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

生成一个0~最大学制的序号表,与学生人数表关联,条件是序号<学制,计算新的年份year+序号,然后对新的年份汇总求和:

with seq as (
    select 0 no
    union all select 1
    union all select 2
    union all select 3
    union all select 4
    union all select 5
), t as (
    select num ,year + no year1
    from admin, seq
    where no<stu_len
)
select year1,sum(num) cnt
from t
group by year1

from admin, seq where no<stu_len 的作用是让每条人数数据根据学制变多条。

老弟,我来回答一下,记得给个解决和关注哦哈哈。
要根据学生的学制统计每年的学生人数,可以使用SQL的GROUP BY和SUM函数来实现。具体步骤如下:

  1. 使用GROUP BY和YEAR函数,按照年度对录取表进行分组,得到每个年度的记录。

  2. 使用SUM函数,对每个年度的录取学生人数进行求和,得到每个年度的总录取人数。

  3. 在SELECT语句中添加CASE语句,根据学生的学制将每个年度的录取学生人数进行分类统计。

下面是具体的SQL语句:

SELECT 
  year, 
  SUM(num) AS total_num, 
  SUM(CASE WHEN stu_len = '1' THEN num ELSE 0 END) AS len_1_num,
  SUM(CASE WHEN stu_len = '2' THEN num ELSE 0 END) AS len_2_num,
  SUM(CASE WHEN stu_len = '3' THEN num ELSE 0 END) AS len_3_num
FROM 
  admit 
GROUP BY 
  YEAR(year);

解释:

  • 在SELECT语句中,我们选择了year作为输出结果的一列,表示年度。
  • 我们使用SUM函数对num列进行求和,得到每个年度的总录取人数,并将结果命名为total_num。
  • 在SELECT语句中,我们使用了三个CASE语句,根据学生的学制对num列进行分类统计。如果学生学制为1,则将num列相加,否则将其设为0。同理,如果学生学制为2或3,则也分别对num列进行分类统计,并将结果分别命名为len_1_num、len_2_num和len_3_num。
  • 最后,我们使用GROUP BY和YEAR函数,按照年度对录取表进行分组,得到每个年度的记录。

运行以上SQL语句,即可得到每个年度的总录取人数,以及每个学制在每个年度的录取人数。