首先是XS数据表:
xh | rxsj(入学时间) | bysj(毕业时间) |
---|---|---|
001 | 20190901 | 20230701 |
002 | 20200901 | 20230701 |
然后是月份对应的XQ_YF学期表:
yf(月份) | xq(学期) |
---|---|
1 |
下 |
2 | 下 |
3 | 上 |
4 | 上 |
5 | 上 |
6 | 上 |
7 | 上 |
8 | 上 |
9 | 下 |
10 | 下 |
11 | 下 |
12 | 下 |
首先要对求出每个xh对应的记录的入学年份,入学月份,毕业年份,毕业月份。
select xh,left(rxsj,4) as rxnf,right(left(rxsj,6),2) as rxyf,
left(bysj,4) as bynf,right(left(bysj,6),2) as byyf
from T_XS
然后通过月份求出对应的学期,即 join 学期表,首先求出入学学期rxxq字段。
select xh,rxnf,XQ_YF.xq as rxxq,bynf,byyf
from
(select xh,left(rxsj,4) as rxnf,right(left(rxsj,6),2) as rxyf,
left(bysj,4) as bynf,right(left(bysj,6),2) as byyf
from T_XS ) xs
left join XQ_YF
ON xs.rxyf=XQ_YF.yf
然后求出毕业学期byxq字段。
select xh,rxnf,rxxq,bynf,XQ_YF.xq as byxq
from
(select xh,rxnf,XQ_YF.xq as rxxq,bynf,byyf
from
(select xh,left(rxsj,4) as rxnf,right(left(rxsj,6),2) as rxyf,
left(bysj,4) as bynf,right(left(bysj,6),2) as byyf
from T_XS ) xs
left join XQ_YF
ON xs.rxyf=XQ_YF.yf ) xs
left join XQ_YF
ON xs.byyf=XQ_YF.yf
此时,查询返回的字段有xh学号,rxnf入学年份,rxxq入学学期,bynf毕业年份,byxq毕业学期。
备注:把上面的代码一整个包起来,起个别名:xs。代码如下:
(select xh,rxnf,rxxq,bynf,XQ_YF.xq as byxq
from
(select xh,rxnf,XQ_YF.xq as rxxq,bynf,byyf
from
(select xh,left(rxsj,4) as rxnf,right(left(rxsj,6),2) as rxyf,
left(bysj,4) as bynf,right(left(bysj,6),2) as byyf
from T_XS ) xs
left join XQ_YF
ON xs.rxyf=XQ_YF.yf ) xs
left join XQ_YF
ON xs.byyf=XQ_YF.yf ) xs
然后就是进行遍历,求出学生对应的每个学年学期,每个学年学期返回一条记录。
#这个是rxnf入学年份
SELECT xh, rxnf, rxxq, NULL AS bynf, NULL AS byxq
FROM xs
UNION ALL
#这个是rxnf入学年份,1学期是下半年的学期,如果rxxq等于2,这里刚好把入学年份的1学期补上,
#如果如果rxxq等于1,这里会重复,最后的结果需要进行一下去重操作
SELECT xh, rxnf, 1, NULL AS bynf, NULL AS byxq
FROM xs
UNION ALL
SELECT xh, rxnf+1, 1, NULL, NULL
FROM xs
WHERE jcnf IS NULL OR (rxnf+1)'2')
UNION ALL
#这个是bynf毕业年份
SELECT xh, bynf, NULL, bynf, byxq
FROM xs
UNION ALL
#这个是bynf毕业年份,1学期是下半年的学期,如果byxq等于1,这里刚好把毕业年份的2学期补上,
#如果如果byxq等于2,这里会重复,最后的结果需要进行一下去重操作
SELECT xh, bynf, NULL, bynf, 2
FROM xs
然后把上面的所有代码用一对小括号包起来,并起个别名 xs。
然后按照自然学年,学期的格式进行处理。自然学年例如2022-2023。
SELECT DISTINCT xh, #DISTINCT就是去重操作
CASE
WHEN bynf is NOT NULL THEN
CASE
WHEN byxq=2 THEN
CONCAT(bynf-1,'-',bynf)
ELSE
CONCAT(bynf,'-',bynf+1)
END
ELSE #如果bynf为空,确定就不是最后毕业年份了,前面将不是毕业年份的记录毕业年份全都为NULL了
CASE
WHEN rxxq=2 THEN
CONCAT(rxnf-1,'-',rxnf)
ELSE
CONCAT(rxnf,'-',rxnf+1)
END
END as xn,
CASE
WHEN byxq is NOT NULL THEN
byxq
ELSE
rxxq
END xq
FROM xs #xs表就是我们前面的(所有代码) as xs
直到这里就是算出每个xh学号包含的所有自然学年,学期了。
以下就是完整代码:
SELECT DISTINCT xh, #DISTINCT就是去重操作
CASE
WHEN bynf is NOT NULL THEN
CASE
WHEN byxq=2 THEN
CONCAT(bynf-1,'-',bynf)
ELSE
CONCAT(bynf,'-',bynf+1)
END
ELSE #如果bynf为空,确定就不是最后毕业年份了,前面将不是毕业年份的记录毕业年份全都为NULL了
CASE
WHEN rxxq=2 THEN
CONCAT(rxnf-1,'-',rxnf)
ELSE
CONCAT(rxnf,'-',rxnf+1)
END
END as xn,
CASE
WHEN byxq is NOT NULL THEN
byxq
ELSE
rxxq
END xq
FROM
(#这个是rxnf入学年份
SELECT xh, rxnf, rxxq, NULL AS bynf, NULL AS byxq
FROM xs
UNION ALL
#这个是rxnf入学年份,1学期是下半年的学期,如果rxxq等于2,这里刚好把入学年份的1学期补上,
#如果如果rxxq等于1,这里会重复,最后的结果需要进行一下去重操作
SELECT xh, rxnf, 1, NULL AS bynf, NULL AS byxq
FROM xs
UNION ALL
SELECT xh, rxnf+1, 1, NULL, NULL
FROM xs
WHERE jcnf IS NULL OR (rxnf+1)'2')
UNION ALL
#这个是bynf毕业年份
SELECT xh, bynf, NULL, bynf, byxq
FROM xs
UNION ALL
#这个是bynf毕业年份,1学期是下半年的学期,如果byxq等于1,这里刚好把毕业年份的2学期补上,
#如果如果byxq等于2,这里会重复,最后的结果需要进行一下去重操作
SELECT xh, bynf, NULL, bynf, 2
FROM xs
) xs #xs表就是我们前面的(所有代码) as xs