【发布时间】:2019-10-13 20:40:01
【问题描述】:
我必须使用存储过程在 MySQL 中逐年生成动态报告表。示例
Table year1
Year1 col1 col2 col3
Table year2
Year2 col1 col2 col3
在
Table3
Year1 col1 col2 col3 Year2 col1 col2 col3
这就像一个连接,但动态。如果用户想要连续 3 年,结果应该是输出中包含所有列的单个表
我的情况是每年 1 张桌子。我想扩展这个存储过程。
CREATE PROCEDURE `Sp_DettaglioCapitolo`(in varAnno smallint,in varCategoria int,in varCapitolo int)
BEGIN
declare cur_idProcedura int;
declare cur_descrizioneEstesa char(200);
declare finished integer default 0;
declare varCapitoloIntestazione varchar(10) default 'Tutti';
declare varCategoriaString varchar(100) default '';
declare nrProcedure int;
declare descrizioneEstesa char(200);
declare nrProcedureAnnoSelezionato int;
declare impegniCompetenza decimal(20,2);
declare impegniLetteraF decimal(20,2);
declare pagamentiCompetenza decimal(20,2);
declare pagamenti decimal(20,2);
declare tot_nrProcedure int default 0;
declare tot_nrProcedureAnnoSelezionato int default 0;
declare tot_impegniCompetenza decimal(20,2) default 0;
declare tot_impegniLetteraF decimal(20,2) default 0;
declare tot_pagamentiCompetenza decimal(20,2) default 0;
declare tot_pagamenti decimal(20,2) default 0;
declare cursoreTabella cursor for
select idtipoprocedura, descrizionebreve from tipoprocedura
where idtipoprocedura in (1,2,3,7,8,9)
order by idtipoprocedura;
declare cursoreTabella2 cursor for
select idtipoprocedura, descrizionebreve from tipoprocedura
where idtipoprocedura >=10
order by idtipoprocedura;
declare cursoreTabella1 cursor for
select idtipoprocedura, descrizionebreve from tipoprocedura
where idtipoprocedura in (4,5,6)
order by idtipoprocedura;
declare continue handler for not found set finished = 1;
drop table if exists tabellaDettaglioCapitoloPerAnno;
create temporary table tabellaDettaglioCapitoloPerAnno (descrizioneEstesa char(200),
nrProcedure int,
nrProcedureAnnoSelezionato int,
impegniCompetenza decimal(20,2),
impegniLetteraF decimal(20,2),
pagamentiCompetenza decimal(20,2),
pagamenti decimal(20,2));
case when varCapitolo <> 0 then
set varCategoriaString = concat('Categoria: ', varCategoria, ' - ', 'Capitolo: ',varCapitolo);
when varCapitolo = 0 then
set varCategoriaString = concat('Categoria: ', varCategoria, ' - ', 'Capitolo: ',varCapitoloIntestazione);
end case;
insert into tabellaDettaglioCapitoloPerAnno (descrizioneEstesa,nrProcedure,nrProcedureAnnoSelezionato,impegniCompetenza,impegniLetteraF,pagamentiCompetenza,pagamenti)
values (varCategoriaString,null,null,null,null,null,null);
insert into tabellaDettaglioCapitoloPerAnno (descrizioneEstesa,nrProcedure,nrProcedureAnnoSelezionato,impegniCompetenza,impegniLetteraF,pagamentiCompetenza,pagamenti)
values ('ACQUISTI EXTRA CONSIP',null,null,null,null,null,null);
open cursoreTabella;
loopTabella: loop
fetch cursoreTabella into
cur_idProcedura,cur_descrizioneEstesa;
if finished = 1 then
leave loopTabella;
end if;
set descrizioneEstesa = cur_descrizioneEstesa;
set nrProcedureAnnoSelezionato = fn_DettaglioCapitoloNrProcedureAnnoSelezionato(varAnno, varCategoria, varCapitolo, cur_idProcedura);
set impegniCompetenza = fn_DettaglioCapitoloPerAnnoImpegniCompetenza(varAnno, varCategoria, varCapitolo, cur_idProcedura);
set nrProcedure = fn_DettaglioCapitoloPerAnnoNrProcedure(varAnno, varCategoria, varCapitolo, cur_idProcedura);
set impegniLetteraF = fn_DettaglioCapitoloPerAnnoLetteraF(varAnno, varCategoria, varCapitolo, cur_idProcedura);
set pagamentiCompetenza = fn_DettaglioCapitoloPerAnnoPagamentiCompetenza(varAnno, varCategoria, varCapitolo, cur_idProcedura);
set pagamenti = fn_DettaglioCapitoloPagamenti(varAnno, varCategoria, varCapitolo, cur_idProcedura);
insert into tabellaDettaglioCapitoloPerAnno (descrizioneEstesa,nrProcedure,nrProcedureAnnoSelezionato,impegniCompetenza,impegniLetteraF,pagamentiCompetenza,pagamenti)
values (descrizioneEstesa,nrProcedure,nrProcedureAnnoSelezionato,impegniCompetenza,impegniLetteraF,pagamentiCompetenza,pagamenti);
set tot_nrProcedure = tot_nrProcedure + nrProcedure;
set tot_nrProcedureAnnoSelezionato = tot_nrProcedureAnnoSelezionato + nrProcedureAnnoSelezionato;
set tot_impegniCompetenza = tot_impegniCompetenza + impegniCompetenza;
set tot_impegniLetteraF = tot_impegniLetteraF + impegniLetteraF;
set tot_pagamentiCompetenza = tot_pagamentiCompetenza + pagamentiCompetenza;
set tot_pagamenti = tot_pagamenti + pagamenti;
end loop;
insert into tabellaDettaglioCapitoloPerAnno (descrizioneEstesa,nrProcedure,nrProcedureAnnoSelezionato,impegniCompetenza,impegniLetteraF,pagamentiCompetenza,pagamenti)
values ('TOTALE ACQUISTI EXTRA CONSIP',tot_nrProcedure,tot_nrProcedureAnnoSelezionato,tot_impegniCompetenza,tot_impegniLetteraF,tot_pagamentiCompetenza,tot_pagamenti);
set tot_nrProcedure = 0;
set tot_nrProcedureAnnoSelezionato = 0;
set tot_impegniCompetenza = 0;
set tot_impegniLetteraF = 0;
set tot_pagamentiCompetenza = 0;
set tot_pagamenti = 0;
set finished = 0;
insert into tabellaDettaglioCapitoloPerAnno (descrizioneEstesa,nrProcedure,nrProcedureAnnoSelezionato,impegniCompetenza,impegniLetteraF,pagamentiCompetenza,pagamenti)
values ('ACQUISTI TRAMITE CONSIP',null,null,null,null,null,null);
open cursoreTabella1;
loopTabella1: loop
fetch cursoreTabella1 into
cur_idProcedura,cur_descrizioneEstesa;
if finished = 1 then
leave loopTabella1;
end if;
set descrizioneEstesa = cur_descrizioneEstesa;
set nrProcedureAnnoSelezionato = fn_DettaglioCapitoloNrProcedureAnnoSelezionato(varAnno, varCategoria, varCapitolo, cur_idProcedura);
set impegniCompetenza = fn_DettaglioCapitoloPerAnnoImpegniCompetenza(varAnno, varCategoria, varCapitolo, cur_idProcedura);
set nrProcedure = fn_DettaglioCapitoloPerAnnoNrProcedure(varAnno, varCategoria, varCapitolo, cur_idProcedura);
set impegniLetteraF = fn_DettaglioCapitoloPerAnnoLetteraF(varAnno, varCategoria, varCapitolo, cur_idProcedura);
set pagamentiCompetenza = fn_DettaglioCapitoloPerAnnoPagamentiCompetenza(varAnno, varCategoria, varCapitolo, cur_idProcedura);
set pagamenti = fn_DettaglioCapitoloPagamenti(varAnno, varCategoria, varCapitolo, cur_idProcedura);
insert into tabellaDettaglioCapitoloPerAnno (descrizioneEstesa,nrProcedure,nrProcedureAnnoSelezionato,impegniCompetenza,impegniLetteraF,pagamentiCompetenza,pagamenti)
values (descrizioneEstesa,nrProcedure,nrProcedureAnnoSelezionato,impegniCompetenza,impegniLetteraF,pagamentiCompetenza,pagamenti);
set tot_nrProcedure = tot_nrProcedure + nrProcedure;
set tot_nrProcedureAnnoSelezionato = tot_nrProcedureAnnoSelezionato + nrProcedureAnnoSelezionato;
set tot_impegniCompetenza = tot_impegniCompetenza + impegniCompetenza;
set tot_impegniLetteraF = tot_impegniLetteraF + impegniLetteraF;
set tot_pagamentiCompetenza = tot_pagamentiCompetenza + pagamentiCompetenza;
set tot_pagamenti = tot_pagamenti + pagamenti;
end loop;
insert into tabellaDettaglioCapitoloPerAnno (descrizioneEstesa,nrProcedure,nrProcedureAnnoSelezionato,impegniCompetenza,impegniLetteraF,pagamentiCompetenza,pagamenti)
values ('TOTALE ACQUISTI TRAMITE CONSIP',tot_nrProcedure,tot_nrProcedureAnnoSelezionato,tot_impegniCompetenza,tot_impegniLetteraF,tot_pagamentiCompetenza,tot_pagamenti);
set tot_nrProcedure = 0;
set tot_nrProcedureAnnoSelezionato = 0;
set tot_impegniCompetenza = 0;
set tot_impegniLetteraF = 0;
set tot_pagamentiCompetenza = 0;
set tot_pagamenti = 0;
set finished = 0;
insert into tabellaDettaglioCapitoloPerAnno (descrizioneEstesa,nrProcedure,nrProcedureAnnoSelezionato,impegniCompetenza,impegniLetteraF,pagamentiCompetenza,pagamenti)
values ('VARIE',null,null,null,null,null,null);
open cursoreTabella2;
loopTabella2: loop
fetch cursoreTabella2 into
cur_idProcedura,cur_descrizioneEstesa;
if finished = 1 then
leave loopTabella2;
end if;
set descrizioneEstesa = cur_descrizioneEstesa;
set nrProcedureAnnoSelezionato = fn_DettaglioCapitoloNrProcedureAnnoSelezionato(varAnno, varCategoria, varCapitolo, cur_idProcedura);
set impegniCompetenza = fn_DettaglioCapitoloPerAnnoImpegniCompetenza(varAnno, varCategoria, varCapitolo, cur_idProcedura);
set nrProcedure = fn_DettaglioCapitoloPerAnnoNrProcedure(varAnno, varCategoria, varCapitolo, cur_idProcedura);
set impegniLetteraF = fn_DettaglioCapitoloPerAnnoLetteraF(varAnno, varCategoria, varCapitolo, cur_idProcedura);
set pagamentiCompetenza = fn_DettaglioCapitoloPerAnnoPagamentiCompetenza(varAnno, varCategoria, varCapitolo, cur_idProcedura);
set pagamenti = fn_DettaglioCapitoloPagamenti(varAnno, varCategoria, varCapitolo, cur_idProcedura);
insert into tabellaDettaglioCapitoloPerAnno (descrizioneEstesa,nrProcedure,nrProcedureAnnoSelezionato,impegniCompetenza,impegniLetteraF,pagamentiCompetenza,pagamenti)
values (descrizioneEstesa,nrProcedure,nrProcedureAnnoSelezionato,impegniCompetenza,impegniLetteraF,pagamentiCompetenza,pagamenti);
set tot_nrProcedure = tot_nrProcedure + nrProcedure;
set tot_nrProcedureAnnoSelezionato = tot_nrProcedureAnnoSelezionato + nrProcedureAnnoSelezionato;
set tot_impegniCompetenza = tot_impegniCompetenza + impegniCompetenza;
set tot_impegniLetteraF = tot_impegniLetteraF + impegniLetteraF;
set tot_pagamentiCompetenza = tot_pagamentiCompetenza + pagamentiCompetenza;
set tot_pagamenti = tot_pagamenti + pagamenti;
end loop;
insert into tabellaDettaglioCapitoloPerAnno (descrizioneEstesa,nrProcedure,nrProcedureAnnoSelezionato,impegniCompetenza,impegniLetteraF,pagamentiCompetenza,pagamenti)
values ('TOTALE VARIE',tot_nrProcedure,tot_nrProcedureAnnoSelezionato,tot_impegniCompetenza,tot_impegniLetteraF,tot_pagamentiCompetenza,tot_pagamenti);
set tot_nrProcedure = 0;
set tot_nrProcedureAnnoSelezionato = 0;
set tot_impegniCompetenza = 0;
set tot_impegniLetteraF = 0;
set tot_pagamentiCompetenza = 0;
set tot_pagamenti = 0;
set finished = 0;
select * from tabellaDettaglioCapitoloPerAnno;
drop temporary table tabellaDettaglioCapitoloPerAnno;
END
结果
'Categoria: 27 - Capitolo: 2270', NULL, NULL, NULL, NULL, NULL, NULL
'ACQUISTI EXTRA CONSIP', NULL, NULL, NULL, NULL, NULL, NULL
'procedura aperta', '0', '0', '0.00', '0.00', '0.00', '0.00'
'procedura ristretta', '0', '0', '0.00', '0.00', '0.00', '0.00'
'procedura negoziata', '0', '0', '0.00', '0.00', '0.00', '0.00'
...
'TOTALE VARIE', '0', '0', '0.00', '0.00', '0.00', '0.00'
最后应该是这样的
我该怎么做? 谢谢
【问题讨论】:
-
请添加一些带有数据和表结构以及预期输出的示例。
-
刚刚添加,谢谢
标签: mysql database stored-procedures