Как я могу объединить динамически таблицы в MySQL - PullRequest
0 голосов
/ 13 октября 2019

Я должен генерировать динамические таблицы отчетов из года в год в MySQL с помощью хранимой процедуры. Пример

Table year1
Year1 col1 col2 col3 

Table year2
Year2 col1 col2 col3

In


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'

должен быть примерно таким в конце

enter image description here

Как я могу это сделать? Спасибо

1 Ответ

0 голосов
/ 14 октября 2019

Вы можете сделать это с помощью 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 и т. Д .: ((Итерация * 4) +1) <--- Итерация, начинающаяся с нуля. </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...