[firebase-br] Ajuda para um Select Sum

Gladiston Santana gladiston em vidy.com.br
Qui Fev 25 09:16:00 -03 2016


Olá meu querido,

Existem diversas maneiras de se fazer, uma bate-pronto é o uso das CTEs, um
jeito elegante de contruir uma querie com resultados em memória, porém o
que vai retornar será um select(com ou sem agregados) a partir desses
resultados. Não é muito performático, mas resolve problemas melhor do que
select usando sum campo por campo como já ví aqui.
Eu deixei as CTEs um pouco de lado porque há uma forma de construir queries
de jeito melhor quando o(s) resultado(s) devem ser arbitrados e depois
somados, chama-se 'execute block', é como uma procedure retornável, porém é
uma querie como qualquer outra, veja se consegue enxergar um select aqui:
EXECUTE BLOCK
RETURNS(id integer,
        pedido_num integer,
        cliente varchar(255),
        data_pedido date,
        valor_total numeric(18,2),
        total_geral numeric(18,2))
as
declare variable l_fechado varchar(1)='';
begin
  total_geral=0.00;
  for Select p.Id, p.Pedido_Num, p.Cliente, p.Data_Pedido, p.fechado,
p.Valor_Total
  from PEDIDO p
  where p.Data_Pedido between :pDataini and :pDatafim
  and p.Fechado = :pConfirmada
  into  :id,
        :pedido_num,
        :Cliente,
        :Data_Pedido,
        :fechado,
        :Valor_Total  do
  begin
    if (condicao_qualquer) then total_geral=(:total_geral+:Valor_Total);
    (daqui em diante...resolva qualquer coisa com if...then que resulte em
somas)
  end
  -- suspend retornará uma linha de resultado
  suspend;
end;

Se você conseguiu entender a idéia, qualquer select significativo você
poderá resolver dessa forma.
Esteja atento que somas que envolvam nulos, os nulos devem ser resolvidos
(geralmente, coalesce) antes da soma, caso contrário você obterá resultados
estranhos.
Outro fator a se levar em conta é a maneira peculiar como por exemplo,
1*1,50 não é 3, multiplicações de inteiro por fracionados devem ser
evitados, use fracionados com fracionados, ex: 1.00*1.50=3.00.

Um abraço e seja feliz.



Mais detalhes sobre a lista de discussão lista