none
Calcular valor de aliquota RRS feed

  • Pergunta

  • Bom dia,

    Estou tentando criar um select para fazer um cálculo de alíquota referente a cada mês, porém está trazendo o mesmo valor para todos os meses e o valor está totalmente errado.

    Alguém poderia me ajudar?

    Criei uma tabela para buscar os dados dela, onde o cálculo refere-se a receita acumulada dos últimos 12 meses.

    A fórmula do cálculo seria  (Rec12meses * Aliq - Desconto / Rec12meses)  where  Rec12meses between [ValorInicial] and [ValorFinal]

    DECLARE @tabela table (

        [ValorInicial]         FLOAT
       ,[ValorFinal]         FLOAT
       ,[Aliq] FLOAT
       ,[Desconto] FLOAT
    )

    INSERT INTO @SimplesNac VALUES
       (0,180000,0.06,0)
      ,(180000.01,360000,0.112,9360)
      ,(360000.01,720000,0.135,17640)
      ,(720000.01,1800000,0.16,35640)
      ,(1800000.01,3600000,0.21,125640)
      ,(3600000.01,4800000,0.33,648000)


    declare @MesInicial int, @AnoInicial int, @MesFinal int, @AnoFinal int;
    set @MesInicial= 1;
    set @AnoInicial= 2019;
    set @MesFinal= 4;
    set @AnoFinal= 2019;

    -- gera variáveis de limitação de período de emissão
    declare @Emissao_de date, @Emissao_ate date;
    set @Emissao_de= convert (date, '1/' + cast (@MesInicial as varchar(2)) + '/' + cast (@AnoInicial as char(4)), 103);
    set @Emissao_ate= convert (date, '1/' + cast (@MesFinal as varchar(2)) + '/' + cast (@AnoFinal as char(4)), 103);

    -- gera variáveis de limitação de período de leitura dos dados
    declare @Leitura_de date, @Leitura_ate date;
    set @Leitura_de= dateadd (year, -1, @Emissao_de);
    set @Leitura_ate= dateadd (day, -1, @Emissao_ate);

    with

    Mes_acumulado as (
    SELECT dateadd (day, -day (T0.TAXDATE) +1, T0.TAXDATE) as InicioMes,
           sum (T0.DOCTOTAL) as soma_Mes
           from OINV as T0
           where T0.TAXDATE between @Leitura_de and @Leitura_ate
           and T0.BPLId = 5 
           and T0.CANCELED = 'N' 
           and T0.MODEL = 46
       group by dateadd (day, -day (T0.TAXDATE) +1, T0.TAXDATE)
    ),
    Meses_emissao as (
      SELECT @Emissao_de as Mes_emissao
      union all
      SELECT dateadd (month, +1, R.Mes_emissao)
      from Meses_Emissao as R
      where R.Mes_emissao < @Emissao_ate
    )
    --
    SELECT 'Receita 12 meses' as Tipo,
       year (T1.Mes_emissao) as Ano, 
       month (T1.Mes_emissao) as Mês, 
       sum (T2.soma_Mes) as Total
               from Meses_emissao as T1
               cross join Mes_acumulado as T2 
               where T2.InicioMes between dateadd (year, -1, T1.Mes_emissao) and dateadd (month, -1, T1.Mes_emissao)
               group by T1.Mes_emissao 

    UNION

       SELECT 'Receita Mês' AS Tipo
       ,YEAR (TAXDATE) AS Ano
       ,MONTH(TAXDATE) AS Mês
       ,SUM(DOCTOTAL) AS Total
       FROM OINV 
       WHERE YEAR(TAXDATE) = @AnoInicial AND BPLId = 5 AND CANCELED = 'N' AND MODEL = 46
       GROUP BY YEAR(TAXDATE),MONTH(TAXDATE) 

    UNION

    SELECT 'Alíquota Nacional'         as Tipo
    ,year (T1.Mes_emissao) as Ano
            ,month (T1.Mes_emissao) as Mês 
    ,sum (T2.soma_Mes * T3.[Aliq] - T3.Desconto / T2.soma_Mes) as Total
    from Meses_emissao as T1
    cross join Mes_acumulado as T2 
    cross join @tabela as T3
    where T2.soma_Mes between T3.[ValorInicial] and T3.[ValorFinal]
    group by T1.Mes_emissao


    segunda-feira, 29 de abril de 2019 13:07

Respostas

Todas as Respostas

  • Deleted
    segunda-feira, 29 de abril de 2019 13:23
  • Bom dia,

    Olhando rapidamente me parece que está faltando a condição abaixo dentro do Where do último Select:

               where T2.InicioMes between dateadd (year, -1, T1.Mes_emissao) and dateadd (month, -1, T1.Mes_emissao)

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    segunda-feira, 29 de abril de 2019 13:24
  • Isso mesmo
    segunda-feira, 29 de abril de 2019 13:35
  • Estou fazendo assim:

    SELECT 'Alíquota Nacional'         as Tipo
    ,year (T1.Mes_emissao) as Ano
            ,month (T1.Mes_emissao) as Mês 
    ,( (sum(T2.soma_Mes) * T3.Aliq)  -  (T3.Desconto / sum(T2.soma_Mes)) ) as Total
    from Meses_emissao as T1
    cross join Mes_acumulado as T2 
    cross join @simplesnac as T3
    where T2.soma_Mes between T3.[ValorInicial] and T3.[ValorFinal] 
    group by T1.Mes_emissao

    Mas informa para adicionar as colunas de Aliq , Desconto no group by

    Se eu adiciono traz esse resultado:

    Alíquota Nacional 2019  1 35225,4552
    Alíquota Nacional 2019  1 149923,738447645
    Alíquota Nacional 2019  2 35225,4552
    Alíquota Nacional 2019  2 149923,738447645
    Alíquota Nacional 2019  3 35225,4552
    Alíquota Nacional 2019  3 149923,738447645
    Alíquota Nacional 2019  4 35225,4552
    Alíquota Nacional 2019  4 149923,738447645

    segunda-feira, 29 de abril de 2019 13:42
  • Acredito que não, pois será necessário consultar a @tabela para saber em qual "nível" de receita o cálculo irá entrar.
    segunda-feira, 29 de abril de 2019 13:44
  • Deleted
    segunda-feira, 29 de abril de 2019 13:58
  • Perfeito, você é o cara! 

    Mais uma vez obrigado!!!

    segunda-feira, 29 de abril de 2019 14:08
  • José, uma dúvida. Pra fazer dessa query uma procedure, teria que mudar muita coisa no código?

    segunda-feira, 29 de abril de 2019 18:32
  • Deleted
    segunda-feira, 29 de abril de 2019 19:47
  • Sim, seria aquelas variáveis que você havia declarado @MesInicial,@AnoInicial, @MesFinal e @AnoFinal.

    Vou precisar criar um relatório e o usuário irá digitar esse parâmetros.

    Cheguei perto aqui, mas fica ocorrendo erro.

    segunda-feira, 29 de abril de 2019 20:18
  • Deleted
    segunda-feira, 29 de abril de 2019 20:36
  • Ah sim, essa questão de segmento me passaram aqui na empresa, então estou tranquilo quanto a isso.

    O correto então seria essa última query que você atualizou, certo? pois contém apenas dois parâmetros...

    segunda-feira, 29 de abril de 2019 20:41
  • Deleted
    segunda-feira, 29 de abril de 2019 20:56
  • José ficou bacana a procedure,

    Eu gostaria de adicionar uma coluna calculando o total por mês e acumulando o valor a cada mês, tentei dessa forma mas ele fica repetindo 4 vezes cada mês, mesmo colocando "group by". Já tentei colocar "group by" no ultimo select também..

    Resolvi colocar uma variável do Ano apenas, dessa forma o usuário digita apenas o ano, acredito que fica mais fácil.

    A query está dessa forma:

    declare @pAno int
    set @pAno = 2019
    declare @Emissao_de date, @Emissao_ate date;
    set @Emissao_de= convert (date, '1/' + cast (1 as varchar(2)) + '/' + cast (@pAno as char(4)), 103);
    set @Emissao_ate= convert (date, '1/' + cast (12 as varchar(2)) + '/' + cast (@pAno as char(4)), 103);

    -- gera variáveis de limitação de período de leitura dos dados
    declare @Leitura_de date, @Leitura_ate date;
    set @Leitura_de= dateadd (year, -1, @Emissao_de);
    set @Leitura_ate= dateadd (day, -1, @Emissao_ate);

    declare @de date, @ate date;
    set @de= @Emissao_de;
    set @ate= @Emissao_ate; 

    -- tabela de alíquotas Simples Nacional 2018 e 2019 - "Receitas de locação de bens móveis ..."
    declare @SimplesNac table (
         ValorInicial decimal(11,2) not null, 
         ValorFinal decimal (11,2) not null,
         Aliq decimal (5,3) not null,
         Desconto decimal(11,2)
    );

    INSERT into @SimplesNac (ValorInicial, ValorFinal, Aliq, desconto) 
      values
         (0, 180000, 0.06, 0),
         (180000.01, 360000, 0.112, 9360),
         (360000.01, 720000, 0.135, 17640),
         (720000.01, 1800000, 0.16, 35640),
         (1800000.01, 3600000, 0.21, 125640),
         (3600000.01, 4800000, 0.33, 648000);

    --
    with

    Acumulado_mes as (
    SELECT dateadd (day, -day (T0.TAXDATE) +1, T0.TAXDATE) as InicioMes,
           sum (T0.DOCTOTAL) as soma_Mes
      from OINV as T0
      where T0.TAXDATE between @Leitura_de and @Leitura_ate
            and T0.BPLId = 5 
            and T0.CANCELED = 'N' 
            and T0.MODEL = 46
      group by dateadd (day, -day (T0.TAXDATE) +1, T0.TAXDATE)
    ),
    Meses_emissao as (
    SELECT @Emissao_de as Mes_emissao
      union all
    SELECT dateadd (month, +1, R.Mes_emissao)
      from Meses_Emissao as R
      where R.Mes_emissao < @Emissao_ate
    ),
    Acumulado_12meses as (
    SELECT T1.Mes_emissao,
           sum (T2.soma_Mes) as soma_12meses
      from Meses_emissao as T1
           cross join Acumulado_mes as T2 
      where T2.InicioMes between dateadd (year, -1, T1.Mes_emissao) and dateadd (month, -1, T1.Mes_emissao)
      group by T1.Mes_emissao
    ),
    TotalMes as (
    SELECT 
           sum (T0.DOCTOTAL) as soma_Mes
      from OINV as T0
      where
      T0.TAXDATE between @DE and @ATE
            and T0.BPLId = 5 
            and T0.CANCELED = 'N' 
            and T0.MODEL = 46
      group by month(T0.TAXDATE)
    )
    --
    SELECT month (A.Mes_emissao) as [Mês],
           year (A.Mes_emissao) as Ano,
       B.soma_Mes as 'Total Mes',
           A.soma_12meses as Total,
           (((A.soma_12meses * S.Aliq) - S.Desconto) / A.soma_12meses) as Tributos
      from Acumulado_12meses as A
       cross join TotalMes B
           cross join @SimplesNac as S
      where round (A.soma_12meses, 2) between ValorInicial and ValorFinal
      order by [Mês], Ano; 



    terça-feira, 30 de abril de 2019 12:03
  • Deleted
    terça-feira, 30 de abril de 2019 12:29
  • Hoje eles utilizam via Excel, mas seria mais ou menos o modelo abaixo:

    O que preciso agora seria o total/mês, total/mês(acumulado) e o valor a pagar do Simples Nacional.

    O restante já está trazendo na query.

    Versão do SQL: 2008

    


    terça-feira, 30 de abril de 2019 13:58
  • Deleted
    terça-feira, 30 de abril de 2019 15:31
  • José, ajustei umas coisas na coluna alíquota e Tributos, mas deu tudo mais que certo.

    Não tenho palavras em como lhe agradecer!

    Muito obrigado mesmo!! Parabéns por compartilhar seu conhecimento, me ajudou e muito.

    Agradeço imensamente!!! Um dia espero chegar ao seu nível de conhecimento em SQL hahaha

    Mais uma vez Obrigado!!!!

    terça-feira, 30 de abril de 2019 19:08
  • Deleted
    terça-feira, 30 de abril de 2019 19:36
  • É mesmo; a alíquota tem que ser multiplicada por 100 na exibição dela, __?

    Isso, além disso eu coloquei aquele cálculo que vc havia feito no outro código para fazer de acordo com o faturamento dos 12 meses.

    Depois te envio o número da minha conta corrente.  rs

    Hahahaha, opaa! manda ai, o problema é que to sem grana no momento!  kkkkk

    Grande abraçoo José, obrigado!!!

    terça-feira, 30 de abril de 2019 20:25