Select Curvas ABC de Clientes

Firebird

03/01/2018

Olá pessoal, estou fazendo um relatório de Curvas ABC de Clientes, porém não consegui gerar as colunas de Percentual Acumulado e a Classificação.

Tenho as seguintes colunas:
cli_id = Código do Cliente ,
cli_razao = Razão Social do Cliente ,
total_pedido = Valor Total dos Pedidos Faturados ,
valor_vista = Valor A Vista dos Pedidos Faturados ,
cr_baixado = Valor Total Baixado do Contas a Receber,
recebido = valor_vista + cr_baixado,
cr_aberto = Valor Total Aberto do Contas a Receber,
total_recebido = Valor total Geral de Recebiveis do Ano,
Percentual Individual = recebido / total_recebido * 100 ,
Percentual Acumulado = Percentual Individual + Percentual Individual do Registro Anterior,
Classificação = Classificação dos registros (A = 80% do Percentual Acumulado, B = 95% do Percentual Acumulado, C = 100% do Percentual Acumulado )

Banco de dados = Firebird 2.5
Criei a Store Procedure
CREATE PROCEDURE SP_CURVAS_CLIENTES (
    ano smallint)
returns (
    cli_id integer,
    cli_razao varchar(120),
    total_pedido numeric(18,2),
    valor_vista numeric(18,2),
    cr_baixado numeric(18,2),
    cr_aberto numeric(18,2),
    recebido numeric(18,2),
    total_recebido numeric(18,2))
as
BEGIN


  FOR
select 
        clientes.cli_id,
        clientes.cli_razao,
        (select
            coalesce(sum(pedidos.ped_total),0)
          from pedidos
        where
            pedidos.status = 1 and  pedidos.cli_id = clientes.cli_id and
            pedidos.tipo_id not in(100,5)  and
            extract(year from pedidos.data_emissao) = :ano) as total_pedido,

        (select
         coalesce(sum(iif(fpgto_id = 1, coalesce(total1,0),
           iif(fpgto_id2 = 1, coalesce(total2,0),
               iif(fpgto_id3 = 1, coalesce(total3,0),0)
              )
            )),0)
          from pedidos
        where
            pedidos.status = 1 and  pedidos.cli_id = clientes.cli_id  and
            pedidos.tipo_id not in(100,5)  and
            extract(year from pedidos.data_emissao) = :ano ) as total_avista,
    
    
        coalesce((select sum(cr.conrec_valor_pago) from contasreceber cr
                  where cr.status = 1 and cr.cli_id = clientes.cli_id and
                  extract(year from cr.data_emissao) = :ano),0) as cr_baixado,
    
        coalesce((select sum(cr.conrec_valor_parcela) from contasreceber cr
                  where cr.status = 0 and cr.cli_id = clientes.cli_id and
                  extract(year from cr.data_emissao) = :ano),0) as cr_aberto,

        sum((select
         coalesce(sum(iif(fpgto_id = 1, coalesce(total1,0),
           iif(fpgto_id2 = 1, coalesce(total2,0),
               iif(fpgto_id3 = 1, coalesce(total3,0),0)
              )
            )),0)
          from pedidos
        where
            pedidos.status = 1 and
            pedidos.tipo_id not in(100,5)  and
            extract(year from pedidos.data_emissao) = :ano ) +
    
    
        coalesce((select sum(cr.conrec_valor_pago) from contasreceber cr
                  where cr.status = 1 and
                  extract(year from cr.data_emissao) = :ano),0))
    
    from clientes
    group by 1,2
    INTO :CLI_ID,
         :CLI_RAZAO,
         :TOTAL_PEDIDO,
         :VALOR_VISTA,
         :cr_baixado,
         :CR_ABERTO,
         :total_recebido
  DO
  BEGIN
    recebido = :valor_vista + :cr_baixado;
    SUSPEND;
  END
END


Select que estou utilizando
select
    cli_id ,
    cli_razao ,
    total_pedido ,
    valor_vista ,
    cr_baixado ,
    recebido ,
    cr_aberto,
    total_recebido,
    recebido / total_recebido * 100 as perc_individual,
    0.00 as perc_acumulado,
    '' as classificacao
from SP_CURVAS_CLIENTES(2017)
where
  recebido > 0
order by recebido desc
Sidney Abreu

Sidney Abreu

Curtidas 0
POSTAR