Fórum Ajuda em montagem e Query #595380
09/07/2018
0
Estou fazendo uma montagem de script para rodar um relatório, porém estou tendo dificuldade e precisaria de um help's! hehe
No caso é um relatório de uma obrigação fiscal, no qual eu poderia colocar um valor de intervalo para buscar as notas e acumular eles no resultando, dando também o somatório total destas notas, por exemplo:
Coloquei que o valor de intervalo será de 10.000 e o limite seria 120.000 (valores podem variar de acordo com a necessidade) o resultado seria:
Stratum limite> limite< qtd notas valor acumulado
1 0 10.000 10 100000
2 10.000 20.000 11 2340000
3 20.000 30.000 12 ...
4 30.000 40.000 17 ...
5 40.000 50.000 3 ...
6 50.000 60.000 20 ...
7 60.000 70.000 4 ...
8 70.000 80.000 9 ...
9 80.000 90.000 33 ...
10 90.000 100.000 41 ...
11 100.000 110.000 14 ...
12 110.000 120.000 34 ...
Qual ideia vocês poderiam compartilhar para montagem deste relatório no sql server? Sei que precisarei usar o count pelas quantidades e etc. O que mais me trava é a parte do intervalo e da limitação que poderá ser escolhida pelo usuário. O que vocês sugerem?
Muito obrigado
Eduardo Sommer
Curtir tópico
+ 0Posts
10/07/2018
Venancio Alves
Você pode criar uma Procedure com dois parâmetros de entrada para o intervalo (minimo e máximo) e criar um if para limitar o valor máximo e apresenta erro ao tentar ultrapassá-lo, caso tenha dúvidas quanto a construção da consulta e da procedure, favor encaminhar a estrutura da sua tabela com dados fictícios para uma melhor análise.
Gostei + 0
11/07/2018
Eduardo Sommer
Montei uma procedure:
DECLARE @intervalo numeric(38,2),
@min numeric(38,2), --- menor valor da tabela
@max numeric(38,2) --- maior valor da tabela
--- pega os valores maximos e minimos usando MIN(), MAX() e conta as linhas da tabela COUNT()
SELECT @max = MAX(VL_DOC),
@min = MIN(VL_DOC)
FROM PISCOFINS_EFD_C100_NF_AVULSA_NF_PRODUTOR_CODIGO_04_E_NFE;
--- Calcula cada intervalo de classe
SET @intervalo = -- Colocar filtro de parametro do quanto será o intervalo.
SELECT @intervalo*FLOOR(VL_DOC/@intervalo) AS [Valor Minimo],
@intervalo*FLOOR(VL_DOC/@intervalo)+@intervalo AS [Valor Maximo],
COUNT(*) AS Quantidade,
NULL as [% da Quantidade],
SUM(VL_DOC) as [Valor Acumulado],
NULL as [% do Valor Total]
FROM (
SELECT ISNULL(NULLIF(VL_DOC, @max),@max-0.5*@intervalo)-@min AS VL_DOC
FROM PISCOFINS_EFD_C100_NF_AVULSA_NF_PRODUTOR_CODIGO_04_E_NFE
where IND_OPER = '1'
and IND_EMIT = '0'
UNION ALL
SELECT ISNULL(NULLIF(VL_DOC, @max), @max-0.5*@intervalo)-@min AS VL_DOC
FROM PISCOFINS_EFD_A100_DOCUMENTO_NOTA_FISCAL_DE_SERVICO
where IND_OPER = '1'
and IND_EMIT = '0'
UNION ALL
SELECT ISNULL(NULLIF(VL_OPER, @max), @max-0.5*@intervalo)-@min AS VL_DOC
FROM PISCOFINS_EFD_F100_DEMAIS_DOCUMENTOS_OPERACOES_GERADORAS_DE_CONTRIBUICAO_CREDITOS
where IND_OPER = '1'
) AS sub
GROUP BY FLOOR(VL_DOC/@intervalo)
ORDER BY FLOOR(VL_DOC/@intervalo);
gostei da ideia que você deu em dar erro se ultrapassar o valor máximo que for informado, mas em vez de dar erro, teria como aparecer o valor (somatorio) que ultrapassou em uma linha final depois do resultado?
ainda falta algumas coisas nessa query, que é ainda mostrar o somatorio total do campo "[Valor Acumulado]" e com ele dar as porcentagens de cada intervalo sobre este valor total.
Obrigado
Gostei + 0
11/07/2018
Venancio Alves
IF @valorMaximo > 120000 BEGIN SELECT SUM(QUANTIDADE) as SOMA_TOTAL WHERE ID_NOTA END
Há inúmeras maneiras de chegar no mesmo resultado, o importante é verificar o desempenho da sua Query.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)