如何用SQL获取基于另一列值+1的学期对应的修读学分总和?
问题描述
我有一个存储学生成绩数据的数据库,每条记录包含STUDENT_ID、attempt_credits、REPORTING_TERM、STUDENT_START_TERM字段,数据示例如下:
| STUDENT_ID | attempt_credits | REPORTING_TERM | STUDENT_START_TERM |
|---|---|---|---|
| 1 | 3 | FA2020 | FA2020 |
| 1 | 4 | FA2020 | FA2020 |
| 1 | 3 | SP2021 | FA2020 |
| 1 | 3 | SP2021 | FA2020 |
| 2 | 3 | SP2021 | SP2021 |
| 2 | 4 | FA2021 | SP2021 |
| 2 | 3 | SP2022 | SP2021 |
| 2 | 3 | SP2022 | SP2021 |
我需要按学期统计attempt_credits的总和:
- 获取第一学期学分时,只需在WHERE子句设置
STUDENT_START_TERM = REPORTING_TERM即可。 - 现在需要获取第二学期的学分总和:
- 入学学期为FA2020的学生,要获取SP2021的学分;
- 入学学期为SP2021的学生,学期进度是SP2021→FA2021→SP2022,需获取SP2022的学分。
我尝试过以下查询,但无法满足特殊场景需求:
SELECT TOP 1 SUM(attempt_credits) FROM TABLE_1 WHERE REPORTING_TERM LIKE 'SP%' ORDER BY REPORTING_TERM
想知道能否实现类似如下逻辑的查询:
SELECT SUM(attempt_credits) FROM TABLE_1 WHERE REPORTING_TERM LIKE 'SP%' AND (LEFT(STUDENT_START_TERM, 4) + 1)
即获取REPORTING_TERM以SP开头且年份为STUDENT_START_TERM年份+1的attempt_credits总和,也就是能否基于另一列值做加法运算来筛选目标列值?
注:我知道上述查询做了简化,缺少聚合所需的GROUP BY子句;且该数据库为团队先前建立的,我只能基于现有结构处理。
解决方案
完全可以基于另一列的值做运算来筛选目标列,针对你的需求,需要把学期的学期标识和年份拆分出来,再做逻辑判断:
按学生统计第二学期学分的查询语句
SELECT STUDENT_ID, SUM(attempt_credits) AS second_term_total_credits FROM TABLE_1 WHERE -- 锁定春季学期记录 REPORTING_TERM LIKE 'SP%' -- 匹配年份:目标学期年份 = 入学学期年份 + 1 AND CAST(RIGHT(REPORTING_TERM, 4) AS INT) = CAST(RIGHT(STUDENT_START_TERM, 4) AS INT) + 1 GROUP BY STUDENT_ID
逻辑说明
- 提取年份并转换类型:用
RIGHT(字段名,4)提取学期字段的后4位年份,再转换为整数类型,才能进行加法运算; - 场景匹配:年份+1的逻辑正好覆盖你提到的两种情况:
- 入学FA2020(年份2020)→ 目标SP2021(2020+1=2021);
- 入学SP2021(年份2021)→ 目标SP2022(2021+1=2022);
- 分组聚合:按
STUDENT_ID分组,得到每个学生第二学期的总学分。
扩展:按目标学期维度统计总和
如果需要统计每个符合条件的学期的总学分(而非按学生),可以修改为:
SELECT REPORTING_TERM, SUM(attempt_credits) AS total_second_term_credits FROM TABLE_1 WHERE REPORTING_TERM LIKE 'SP%' AND CAST(RIGHT(REPORTING_TERM, 4) AS INT) = CAST(RIGHT(STUDENT_START_TERM, 4) AS INT) + 1 GROUP BY REPORTING_TERM
内容的提问来源于stack exchange,提问作者M J
相关产品推荐
相关产品推荐

