Utilização do Union dentro do Execute Blocks

SQL

Banco de Dados

SELECT

IBExpert

Firebird

30/06/2022

Boa tarde.

Estou com dificuldades em construir uma consulta SQL utilizando UNION dentro do Execute Block no FireBird 2.5.

Primeiramente FORA do execute blocks estou utilizando duas tabelas "contas_receber" e "contas_pagar" que não possuem relação entre si (e preciso utilizar union). Aí preciso colocar um filtro para as contas no status "A", em aberto, mas tô enfrentando dificuldades porque preciso apresentar o MÊS da data de emissão da conta, o VALOR A RECEBER e em outra coluna o VALOR A PAGAR, mas quando utilizo o union ele acaba colocando os meses e os valores a pagar logo abaixo dos que vão receber.

Adicionei as colunas TIPO e N° Mês para facilitar para vocês visualizarem quais são CP = Contas a pagar e CR = Contas a Receber, mas originalmente teriam apenas os campos Mês (tipo Janeiro, etc), Contas Receber(Soma de cada Mês) e Contas Pagar(Soma de cada Mês)
select
            case extract (month from cr.data_emissao)
                  when 1 then ''Janeiro''
                  when 2 then ''Fevereiro''
                  when 3 then ''Março''
                  when 4 then ''Abril''
                  when 5 then ''Maio''
                  when 6 then ''Junho''
                  when 7 then ''Julho''
                  when 8 then ''Agosto''
                  when 9 then ''Setembro''
                  when 10 then ''Outubro''
                  when 11 then ''Novembro''
                  when 12 then ''Dezembro''
             end"Mês", sum(cr.valor_aberto)"Valor a Receber", extract (month from cr.data_emissao)"N° do Mês",''CR''"TIPO"
    from contas_receber cr
    where cr.status = ''A''
    group by extract (month from cr.data_emissao)

union all

select
        case extract (month from cp.data_emissao)
          when 1 then ''Janeiro''
          when 2 then ''Fevereiro''
          when 3 then ''Março''
          when 4 then ''Abril''
          when 5 then ''Maio''
          when 6 then ''Junho''
          when 7 then ''Julho''
          when 8 then ''Agosto''
          when 9 then ''Setembro''
          when 10 then ''Outubro''
          when 11 then ''Novembro''
          when 12 then ''Dezembro''
        end"Mês",sum(cp.valor_aberto)"Valor a Pagar", extract (month from cp.data_emissao)"N° do Mês",''CP''"TIPO"

    from contas_pagar cp
    where cp.status = ''A''
    group by extract (month from cp.data_emissao)
    order by 3


PRINT DO RESULTADO: https://prnt.sc/BIMlLsQdSR56

Aí pensei em corrigir dentro do Execute Blocks utilizando variáveis, mas não sei como ficaria a estrutura de um union dentro do execute blocks por conta dos "returns". Por hora consegui replicar o resultado de antes dentro do execute blocks, mas como faço para colocar as informações de CP em outra coluna?

execute block
returns ("Mês" varchar(15), r_valorCR numeric(15,2),r_valorCP numeric(15,2), r_saldo numeric (15,2))
as
begin
    for
        select
            case extract (month from cr.data_emissao)
                  when 1 then ''Janeiro''
                  when 2 then ''Fevereiro''
                  when 3 then ''Março''
                  when 4 then ''Abril''
                  when 5 then ''Maio''
                  when 6 then ''Junho''
                  when 7 then ''Julho''
                  when 8 then ''Agosto''
                  when 9 then ''Setembro''
                  when 10 then ''Outubro''
                  when 11 then ''Novembro''
                  when 12 then ''Dezembro''
             end"Mês", sum(cr.valor_aberto)"Valor a Receber"
    from contas_receber cr
    where cr.status = ''A''
    group by extract (month from cr.data_emissao)

union all

select
        case extract (month from cp.data_emissao)
          when 1 then ''Janeiro''
          when 2 then ''Fevereiro''
          when 3 then ''Março''
          when 4 then ''Abril''
          when 5 then ''Maio''
          when 6 then ''Junho''
          when 7 then ''Julho''
          when 8 then ''Agosto''
          when 9 then ''Setembro''
          when 10 then ''Outubro''
          when 11 then ''Novembro''
          when 12 then ''Dezembro''
        end"Mês",sum(cp.valor_aberto)"Valor a Pagar"

    from contas_pagar cp
    where cp.status = ''A''
    group by extract (month from cp.data_emissao)
    into "Mês", r_valorCR
  do
  begin
  suspend;
  end
end


PRINT DO RESULTADO USANDO EXECUTE BLOCKS: https://prnt.sc/SVegUcNKmRFb

RESULTADO FINAL ESPERADO: https://prnt.sc/PPJlrg_hwqQx
Ganso Ltda

Ganso Ltda

Curtidas 0
POSTAR