Usuário com melhor resposta
Calcular valor de aliquota

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
Respostas
Todas as Respostas
-
-
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
-
-
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_emissaoMas 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 -
-
-
-
-
-
-
-
-
-
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;
- Editado Rafael M. Palma terça-feira, 30 de abril de 2019 12:05
-
-
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
- Editado Rafael M. Palma terça-feira, 30 de abril de 2019 14:03
-
-
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!!!!
-
-
É mesmo; a alíquota tem que ser multiplicada por 100 na exibição dela, _né_?
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!!!