背景:有每个月的信息表,想要查询一年内每个月的指标变化,需要对连续2个月的表进行连表查询。eg 从1月到2月,某项指标的变化;从2月到3月,某项指标的变化。
目标:通过循环得到2个连续的日期表名,然后通过表名进行查询
方法:因为12个表名的格式为XXX+月份+30号。eg:XXX20210130、XXX20210130,我们只需要创建一张日期表,把20210130、20210130等共12个数据插入表中,然后通过游标循环得到连续的2个日期,再拿这2个日期作为表名去查询。
DROP PROCEDURE IF EXISTS test;
DROP TABLE IF EXISTS result_table; #连表查询的结构就放在result_table里
CREATE PROCEDURE test()
BEGIN
DECLARE last_vari VARCHAR(20);#上一个变量
DECLARE now_vari varchar(20);#当前变量(和上一个变量是挨着的)
DECLARE done int DEFAULT 0; #定义游标结束的标志
DECLARE cursor_name CURSOR FOR
SELECT dataid FROM datalist;#遍历日期表
DECLARE CONTINUE HANDLER FOR NOT found SET done = 1; #游标走完了,就把done赋值1
OPEN cursor_name;
SET last_vari = '';#初始化变量
REPEAT
FETCH cursor_name INTO now_vari; #把游标遍历得到的当前dataid赋值给now_vari
if done != 1 && last_vari !='' then #如果游标指向的是第二个及以后的dataid(我们有2个连续的日期)
SET @sqlStr:=CONCAT("insert into result_table SELECT * from
(SELECT * FROM
(select * FROM XXX",last_vari,") AS a
left JOIN
(select * FROM XXX",now_vari,") AS b
on a.`借据号`=b.`借据号` ) AS c");#把查询的结果插入表中;这里的查询语句只是示例,自己根据写业务自己的查询语句;
PREPARE stmt from @sqlStr;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
set last_vari = now_vari; #把now_vari赋值给last_vari
ELSEIF done != 1 && last_vari ='' then #如果游标指向的是第一个dataid(我们没有2个连续的日期)
set last_vari = now_vari; #把当前dataid赋值给last_vari
SET @sqlStr1:=CONCAT("CREATE TABLE result_table AS SELECT * from
(SELECT * FROM
(select * FROM XXX",last_vari,") AS a
left JOIN
(select * FROM XXX",now_vari,") AS b
on a.`借据号`=b.`借据号` ) AS c LIMIT 0");#这里的查询语句只是示例,自己根据写业务自己的查询语句
#这里的目的是创建result_table并定义表,以后只需要向表添加数据即可;LIMIT 0不可少,不然查出来的数据就会插入表(此时我们没有连续的2个日期,查出来的数据是不对的)
PREPARE stmt1 from @sqlStr1;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
SELECT * FROM result_table;
end if;
UNTIL done = 1
END REPEAT;
CLOSE cursor_name ;
SELECT * FROM result_table;
END
call test()