MySQL对一个表中的每一条记录的时间段进行拆分成多条记录

首先是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

你可能感兴趣的:(MYSQL数据库,数据库,sql,mysql)