【问题标题】:How can I concatenate dynamically tables in MySQL如何在 MySQL 中动态连接表
【发布时间】: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


【解决方案1】:

您可以使用 JOIN 来执行此操作,但要小心,因为两个表都必须很好地连接,否则会导致比您预期的多得多的记录。 正如我在下一个示例中向您解释的那样,您必须创建一些元数据。几年前我面临着与你类似的情况。

SELECT
Year1, col1, col2, col3, Year2, col1, col2, col3
FROM 
year1 INNER JOIN year2
ON (___Here you have to Join Data with "according columns"___)

在您的情况下,“根据列”肯定不会是您示例中列出的列(Year1、col1、col2 等)。 这些列必须包含一些数据,这些数据仅适合您的 SQL 以以这种方式创建报告。 称之为“你自己的元数据”。

希望本指南有所帮助。

PS:如果你在 VBA 中已经有一个每年的函数,为什么不格式化一个工作表? 您可以传递年份和开始格式化的起始单元格。因此,您可以根据需要为每年添加一个单元格间隙来格式化报告。 例如,第一年可以从第 1 列开始,第二年可以从第 5 列开始,依此类推: ((Iteration*4)+1)

【讨论】:

  • 谢谢你的回答,但主要问题是我不知道我的程序需要计算多少年,所以我必须做一些准备好的语句来组成我的最终查询我认为
  • 好的,您可以使用多个 JOINS 扩展我的示例。元数据列仅用于拟合和创建 linear.horizo​​ntal 结果集,避免笛卡尔计算。
猜你喜欢
  • 2011-08-15
  • 1970-01-01
  • 2012-01-16
  • 2023-01-12
  • 2015-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多